Python/Numba:scipy.special.gammainc() 出现未知属性错误
Python/Numba: Unknown attribute error with scipy.special.gammainc()
我在使用 @jit 装饰器 运行ning 代码时遇到错误。似乎找不到函数 scipy.special.gammainc() 的某些信息:
Failed at nopython (nopython frontend)
Unknown attribute 'gammainc' for Module(<module 'scipy.special' from 'C:\home\Miniconda\lib\site-packages\scipy\special\__init__.pyc'>) 4.2 4.3 = getattr(attr=gammainc, value=4.2)
如果没有 @jit 装饰器,代码将 运行 正常。也许需要一些东西才能使 scipy.special 模块的属性对 Numba 可见?
提前感谢您的任何建议、评论等
问题是 gammainc
不是 Numba 本身就知道如何处理的一小部分函数之一(参见 http://numba.pydata.org/numba-doc/dev/reference/numpysupported.html)- 实际上 none scipy 函数是。这意味着您不能在 "nopython" 模式下使用它,不幸的是 - 它只需要将其视为正常的 python 函数调用。
如果您删除 nopython=True
,它应该可以工作。然而,这并不是非常令人满意,因为它可能会更慢。如果没有看到您的代码,就很难知道确切的建议。但是,一般来说:
循环(不包含 gammainc
之类的内容)将被加速,即使没有 python.
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()
将这两个循环标识为 "lifted loops",这意味着它们将被 JIT 和 运行 快速处理。带有 gammainc
的位不是 JIT,而是一次应用于整个数组,因此也应该很快。
我在使用 @jit 装饰器 运行ning 代码时遇到错误。似乎找不到函数 scipy.special.gammainc() 的某些信息:
Failed at nopython (nopython frontend)
Unknown attribute 'gammainc' for Module(<module 'scipy.special' from 'C:\home\Miniconda\lib\site-packages\scipy\special\__init__.pyc'>) 4.2 4.3 = getattr(attr=gammainc, value=4.2)
如果没有 @jit 装饰器,代码将 运行 正常。也许需要一些东西才能使 scipy.special 模块的属性对 Numba 可见?
提前感谢您的任何建议、评论等
问题是 gammainc
不是 Numba 本身就知道如何处理的一小部分函数之一(参见 http://numba.pydata.org/numba-doc/dev/reference/numpysupported.html)- 实际上 none scipy 函数是。这意味着您不能在 "nopython" 模式下使用它,不幸的是 - 它只需要将其视为正常的 python 函数调用。
如果您删除 nopython=True
,它应该可以工作。然而,这并不是非常令人满意,因为它可能会更慢。如果没有看到您的代码,就很难知道确切的建议。但是,一般来说:
循环(不包含
gammainc
之类的内容)将被加速,即使没有 python.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()
将这两个循环标识为 "lifted loops",这意味着它们将被 JIT 和 运行 快速处理。带有 gammainc
的位不是 JIT,而是一次应用于整个数组,因此也应该很快。