【问题标题】:Python/Numba: Unknown attribute error with scipy.special.gammainc()Python / Numba:scipy.special.gammainc()的未知属性错误
【发布时间】:2015-11-05 15:39:13
【问题描述】:

使用@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 可见?

提前感谢您的任何建议、cmets 等。

【问题讨论】:

  • 你试过from scipy import specialfrom scipy.special import ge...吗?有时从scipy 导入很棘手。
  • 感谢这些建议,不幸的是,当我尝试上述所有导入方法时,我仍然遇到错误:在 nopython (nopython frontend) Untyped global name 'gammainc' 失败

标签: python numpy scipy anaconda numba


【解决方案1】:

问题在于 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 的,而是一次应用于整个数组,因此也应该很快。

【讨论】:

  • 很好的回应,大卫。就像你说的代码在没有 nopython=True 的情况下运行良好。我只是想把事情做到最后并尽可能从 Numba 中获得最大的收益,但是从您上面的解释看来,在对象模式下编译时我仍然会获得性能改进。在这个包含 gammainc 的函数上使用带有对象模式的 \@jit 时,我得到了看起来 20% 的性能提升,但是我已经被我在另一个上使用 \@jit 后所看到的巨大收益所宠坏了函数,所以让 nopython 模式来处理这个函数是我的目标。
猜你喜欢
  • 1970-01-01
  • 2012-09-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多