sqlserver循环like变量_numba从入门到精通(6)—numba与循环与并行

多进程、多线程、并行的调用方式的不同以及python各种常用且优化较好的并行的处理方法,回头要总结一下,概念模糊很蒙蔽。我们这里介绍一下numba强大并且简单易用的并行功能。

import numpy
from numba import njit
def do_trig(x, y):
    z = numpy.empty_like(x)
    for i in range(x.shape[0]):
        for j in range(x.shape[1]):
            z[i, j] = numpy.sin(x[i, j]**2) + numpy.cos(y[i, j])
    return z

x = numpy.random.random((1000, 1000))
y = numpy.random.random((1000, 1000))

%timeit do_trig(x, y)

879ec07c4dd3685b8de4347ac882f6eb.png

下面我们jit一下

@njit
def do_trig(x, y):
    z = numpy.empty_like(x)
    for i in range(x.shape[0]):
        for j in range(x.shape[1]):
            z[i, j] = numpy.sin(x[i, j]**2) + numpy.cos(y[i, j])
    return z

7cb2192e14304e440809cb4ad24ebf5e.png

very nice,改变编译的方式特别是在这种大量循环的情况下能提升非常多速度呢。

004f1e11b2cce24e44563aa425df8edd.png

接下来我们使用numba中的并行功能来并行化循环。

import numba
from numba import njit,prange
numba.config.NUMBA_DEFAULT_NUM_THREADS=4
@njit(parallel=True)
def do_trig(x, y):
    z = numpy.empty_like(x)
    for i in prange(x.shape[0]):
        for j in prange(x.shape[1]):
            z[i, j] = numpy.sin(x[i, j]**2) + numpy.cos(y[i, j])
    return z

%timeit do_trig(x, y)

6333642c96f00a0e6df230780b12f162.png

需要注意的是,numba并行的时候使用的线程数通过numba的环境变量来设置,应该针对不同的任务设置大小,并不是越大越好因为调用多个线程也是存在开销的,另外原来的range循环要用numba特有的prange替换,这样numba才能识别循环并且进行相应的并行化。


我们前面提到的vectorize并行化就更简单了。。。可以把直接把矩阵运算进行并行。。。见下:

@vectorize
def do_trig_vec(x, y):
    z = math.sin(x**2) + math.cos(y)
    return z

%timeit do_trig_vec(x, y)

65c986bebaa64a22dfd084402150d3eb.png
@vectorize('float64(float64, float64)', target='parallel')
def do_trig_vec_par(x, y):
    z = math.sin(x**2) + math.cos(y)
    return z

%timeit do_trig_vec_par(x, y)

7ef6226f554bd2eaa8354bf489a7d0f3.png

numba在vectorize修饰函数的情况下,可以直接对矩阵运算进行并行,牛逼,太方便了哈哈哈哈哈哈哈哈,而且用起来真是太简单了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值