Python/Numba:scipy.special.gammainc()的未知属性错误

Python/Numba:scipy.special.gammainc()的未知属性错误,python,numpy,scipy,anaconda,numba,Python,Numpy,Scipy,Anaconda,Numba,我在使用@jit decorator运行代码时出错。似乎找不到函数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'>) $164.

我在使用@jit decorator运行代码时出错。似乎找不到函数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'>) $164.2 $164.3 = getattr(attr=gammainc, value=$164.2)
在nopython(nopython前端)失败
模块()的未知属性'gammainc'$164.2$164.3=getattr(attr=gammainc,value=$164.2)
如果没有@jit装饰器,代码将运行良好。也许需要一些东西才能使scipy.special模块的属性对Numba可见


提前感谢您提供的任何建议、评论等。

问题在于
gammainc
不是Numba天生知道如何处理的一小部分函数(请参阅)-事实上,没有一个scipy函数是。不幸的是,这意味着您不能在“nopython”模式下使用它——它只需将其视为普通的python函数调用

如果删除
nopython=True
,它应该可以工作。然而,这并不十分令人满意,因为它可能会慢一些。如果没有看到您的代码,就很难知道确切的建议。然而,总的来说:

  • 循环(不包含像
    gammainc
    )这样的东西)将加快速度,即使没有nopython

  • gammainc
    是一个“ufunc”,这意味着它可以一次轻松地应用于整个阵列,并且无论如何都应该快速运行

  • 您可以调用
    func.inspect\u 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,而是一次应用于整个阵列,因此速度也应该很快。

您是否尝试过scipy import special的
或scipy.special import ge的
?有时从scipy导入是很棘手的。感谢这些建议,不幸的是,当我尝试上述所有导入方法时,我仍然会遇到错误:在Nopyton(Nopyton frontend)失败,未键入全局名称“gammainc”,反应非常好,David。就像你说的代码运行良好,没有nopython=True。我只是想把事情做到底,尽可能地从Numba中挖掘出更多的东西,但是从您上面的解释来看,在对象模式下编译时,我仍然可以获得性能改进。在这个包含gammainc的函数上使用带有对象模式的\@jit时,我获得了20%的性能提升,但我已经被在其他函数上使用\@jit后所获得的巨大收益所宠坏了,所以让nopython模式在这个函数上工作是我的目标。