Python 中带有 numba 的简单求和函数不计算

Jim*_*Boy 6 python numba

我正在尝试学习 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)

Jos*_*del 6

您正在传递数组,但您的 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)

我的经验是,添加类型很少会给性能带来任何好处。

  • @JimBoy - 不指定调用签名的 `@jit` 与 `@autojit` 相同。如果您查看当前的 numba 文档,则不推荐使用 `autojit` (https://github.com/numba/numba/blob/master/numba/decorators.py)。此外,我倾向于指定 `nopython=True`,除非我特别知道我将需要“对象模式”(参见 http://numba.pydata.org/numba-doc/0.21.0/glossary。 html),因为这可以确保如果 numba 不支持将所有内容编译为本机代码,我会收到编译错误。这通常是一个警告信号,表明 numba 没有做我期望它做的事情 (2认同)