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

Jam*_*ams 4 python numpy scipy anaconda numba

使用@jit装饰器运行代码时出错.似乎无法找到函数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)
Run Code Online (Sandbox Code Playgroud)

如果没有@jit装饰器,代码将运行正常.也许有必要使scipy.special模块的属性对Numba可见?

提前感谢任何建议,评论等.

Dav*_*idW 5

问题是,这gammainc不是Numba固有知道如何处理的小功能列表之一(参见http://numba.pydata.org/numba-doc/dev/reference/numpysupported.html) - 实际上没有scipy函数是.这意味着你不能在"nopython"模式下使用它,不幸的是 - 它只需将它视为普通的python函数调用.

如果你删除nopython=True,它应该工作.然而,这并不是非常令人满意,因为它可能会慢一些.如果没有看到您的代码,就很难确切知道建议的内容.但是,一般来说:

  • gammainc即使没有nopython,循环(不包含类似的东西)也会加速.

  • 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
Run Code Online (Sandbox Code Playgroud)

然后f.inspect_types()将两个循环标识为"提升的循环",这意味着它们将被JIT并快速运行.该位gammainc不是JIT'd,而是立即应用于整个数组,所以也应该快.