问题是gammainc不是Numba固有知道如何处理的小函数列表之一(见
http://numba.pydata.org/numba-doc/dev/reference/numpysupported.html) – 实际上没有scipy函数.这意味着你不能在“nopython”模式下使用它,不幸的是 – 它只需将它视为普通的python函数调用.
如果你删除nopython = True,它应该工作.然而,这并不是非常令人满意,因为它可能会慢一些.如果没有看到您的代码,就很难确切知道建议的内容.但是,一般来说:
即使没有nopython,也会加速>循环(不包含像gammainc这样的东西).
> gammainc是一个“ufunc”,这意味着它可以一次容易地应用于整个数组,并且无论如何都应该快速运行.
>您可以调用func.inspect_types()来查看它是否能够编译.
作为一个简单的例子:
from scipy.special import gammainc
import numba as nb
import numpy as np
@nb.jit # note - no "nopython"
def f(x):
for n in range(x.shape[0]):
x[n] += 1
y = gammainc(x,2.5)
for n in range(y.shape[0]):
y[n] -= 1
return y
f(np.linspace(0,20)) # forces it to be JIT'd and outputs an array
然后f.inspect_types()将两个循环标识为“提升的循环”,这意味着它们将被JIT并快速运行. gammainc的位不是JIT’d,而是一次应用于整个数组,所以也应该快.