我正在使用稳定版的Numba 0.30.1.
我可以做这个:
import numba as nb @nb.jit("void(f8[:])",nopython=True) def complicated(x): for a in x: b = a**2.+a**3.
作为一个测试案例,加速是巨大的.但是如果我需要加速一个类中的函数,我不知道如何继续.
import numba as nb def myClass(object): def __init__(self): self.k = 1 #@nb.jit(???,nopython=True) def complicated(self,x): for a in x: b = a**2.+a**3.+self.k
我用什么numba类型的self
对象?我需要在类中包含此函数,因为它需要访问成员变量.
我当时的处境非常相似,我找到了在类中使用Numba-JITed函数的方法。
诀窍是使用静态方法,因为这种方法不会称为将对象实例放在参数列表之前。无法访问的缺点self
是您不能使用在方法外部定义的变量。因此,您必须将它们从具有访问权限的调用方法传递给静态方法self
。就我而言,我不需要定义包装方法。我只需要将要JIT编译的方法分为两个方法。
对于您的示例,解决方案将是:
from numba import jit
class MyClass:
def __init__(self):
self.k = 1
def calculation(self):
k = self.k
return self.complicated([1,2,3],k)
@staticmethod
@jit(nopython=True)
def complicated(x,k):
for a in x:
b = a**2 .+ a**3 .+ k
您有几种选择:
使用jitclass
(http://numba.pydata.org/numba-doc/0.30.1/user/jitclass.html)对整个内容进行“数字化处理”。
或者将成员函数包装,并通过以下方式传递成员变量:
import numba as nb @nb.jit def _complicated(x, k): for a in x: b = a**2.+a**3.+k def myClass(object): def __init__(self): self.k = 1 def complicated(self,x): _complicated(x, self.k)