我正在尝试学习 Python 和 Numba,但我不明白为什么以下代码不能在 IPython/Jupyter 中计算:
from numba import *
sample_array = np.arange(10000.0)
@jit('float64(float64, float64)')
def sum(x, y):
return x + y
sum(sample_array, sample_array)
Run Code Online (Sandbox Code Playgroud)
TypeError Traceback(最近一次调用最后一次) in () ----> 1 sum(sample_array, sample_array)
C:\Users***\AppData\Local\Continuum\Anaconda\lib\site-packages\numba\dispatcher.pyc in _explain_matching_error(self, *args, **kws) 201 msg = ("没有匹配的参数类型定义(s) %s" 202 % ', '.join(map(str, args))) --> 203 raise TypeError(msg) 204 205 def repr (self):
类型错误:没有匹配的参数类型定义数组(float64, 1d, C), array(float64, 1d, C)
您正在传递数组,但您的 jit 签名需要标量浮点数。请尝试以下操作:
@jit('float64[:](float64[:], float64[:])')
def sum(x, y):
return x + y
Run Code Online (Sandbox Code Playgroud)
我的建议是看看你是否可以不指定类型而只使用裸@jit装饰器,它会在运行时进行类型推断,你可以更灵活地处理输入。例如:
@jit(nopython=True)
def sum(x, y):
return x + y
In [13]: sum(1,2)
Out[13]: 3
In [14]: sum(np.arange(5),np.arange(5))
Out[14]: array([0, 2, 4, 6, 8])
Run Code Online (Sandbox Code Playgroud)
我的经验是,添加类型很少会给性能带来任何好处。