Python/数字:scipy.special.gammainc()出现未知属性错误

6mzjoqzu  于 2023-01-13  发布在  Python
关注(0)|答案(1)|浏览(129)

我在使用@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)

如果没有@jit装饰器,代码将运行良好。也许需要一些东西来使scipy.special模块的属性对Numba可见?

k3fezbri

k3fezbri1#

问题是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

然后f.inspect_types()将这两个循环标识为“提升循环”,这意味着它们将是JIT的并且运行得很快。gammainc中的位不是JIT的,而是一次应用于整个数组,因此也应该很快。

相关问题