numba 中的@jit 和@vectorize 有啥区别?

Posted

技术标签:

【中文标题】numba 中的@jit 和@vectorize 有啥区别?【英文标题】:What is the difference between @jit and @vectorize in numba?numba 中的@jit 和@vectorize 有什么区别? 【发布时间】:2018-05-13 15:00:06 【问题描述】:

什么时候应该使用@vectorize?

我尝试了@jit 并显示了下面的那部分代码,

from numba import jit

@jit
def kma(g,temp): 
    k=np.exp(-(g+np.abs(g))/(2*temp))   
    return k

但我的代码没有加速算法。为什么?

【问题讨论】:

【参考方案1】:

@vectorize 用于编写一个表达式,该表达式可以一次将一个元素(标量)应用于数组。 @jit 装饰器更通用,可以处理任何类型的计算。

文档中详细讨论了其他好处:

http://numba.pydata.org/numba-doc/latest/user/vectorize.html

您可能会问自己,“我为什么要通过这个而不是使用 @jit 装饰器编译一个简单的迭代循环?”。答案是 NumPy ufuncs 会自动获取其他特性,例如归约、累加或广播。

您的代码没有被加速的原因(我看到 jitted 和 non-jitted 代码之间的性能几乎相同)是您正在执行的操作已经完全由低级编译代码处理在 numpy 矢量化操作的背后。

如果您展开隐式循环以避免创建中间数组,您可能会节省一些费用,但通常 numba 非常适合在 numpy 中不易矢量化的操作。

【讨论】:

你的意思是上面的代码因为 numpy 已经处理了,所以不能被 jitted? Numba 通常在“for 循环”中很有用?

以上是关于numba 中的@jit 和@vectorize 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

如何使 numba @jit 使用所有 cpu 内核(并行化 numba @jit)

numba - guvectorize 几乎比 jit 快

调用 numba jit 函数时,cProfile 会增加大量开销

将 numba.jit 与 scipy.integrate.ode 一起使用

与 Python+Numba LLVM/JIT 编译的代码相比,Julia 的性能

Numba 中的稀疏矩阵