Python 使用numba.jit加速代码
我正在尝试使用Python 使用numba.jit加速代码,python,numpy,jit,numba,Python,Numpy,Jit,Numba,我正在尝试使用numba.jit来加速python程序 我的程序的一个函数将一个floats数组和一个标量相乘,标量总是一个整数 import numpy myarray = numpy.array([0.2,0.26,0.45,0.78],dtype=float) def multiply(array, scalar): newarray = array * scalar return newarray newarray = multiply(myarray,5) 当我n
numba.jit来加速python程序
我的程序的一个函数将一个float
s数组和一个标量相乘,标量总是一个整数
import numpy
myarray = numpy.array([0.2,0.26,0.45,0.78],dtype=float)
def multiply(array, scalar):
newarray = array * scalar
return newarray
newarray = multiply(myarray,5)
当我numba.jit()
my函数具有以下签名时,函数运行速度会慢一个数量级:
fastmultiply = numba.jit("f4[:](f4[:],int8)")(multiply)
这是因为我声明了错误的数据类型:f4[:]
和int8
或者,我的函数的编码方式不允许使用numba.jit()
?节省工作量v/s生成的jit
-代码重复使用量进行加速
JIT可以帮助解决这样的情况,即大量的重复使用证明了即时编译的成本是合理的
因此,随着.jit()
编译器处理源代码,代码的第一次运行需要更长的时间
注意工作的经济性-对于“短”代码,这可能比最终jit编译的产品需要几个数量级的时间,因此,只有在有数百万个重复使用案例的情况下,调整这样的初始机会成本惩罚才可能是合理的
对于一个“计算密集度更高”的代码,通常是一个非平凡的卷积、迭代再处理方法等,jit编译的成本甚至在单独的情况下也是合理的
这是一个单独的主题,错误的类型可能会影响您的处理
显式.jit()
签名或.autojit()
?这就是哈姆雷特的困境
嗯,这取决于你的喜好应收集任何一种方法的初始调用/重复使用调用持续时间的定量证据,并根据预期的重复使用调用量(成本/收益不平等)进行决定
需要分析/调整的autojit()签名的额外成本
,可能会使成本/收益不平等的边缘变形
维护.jit()
显式签名可能会让人头疼
小心:
首先,np.float
是不是f4
|>>> np.arange( 2, dtype = float ).dtype
dtype('float64')
下一步,有一些情况(np.nan\u to_num()
就是其中之一),可能会收到“静默”向上播放的dtype
到np.float64
,这可能会导致头痛,寻找dtype
与numba.jit()冲突的地方
显式签名。您的函数所做的唯一一件事就是调用一个已经优化过的numpy函数-没有太多的优化潜力。因此,在使用numpy数组时,对于提高性能没有什么可做的?numba主要用于加速无法利用numpy快速矢量化数组的代码选项,例如,在其他情况下,您被迫对
循环使用嵌套Python。numpy数组已经有了高度优化的乘法方法,因此在本例中使用numba不太可能做得更好。尽管如此,编译函数会降低一个数量级的性能,这是非常有趣的。
|>>> np.arange( 2, dtype = float ).dtype
dtype('float64')