当 class 的属性包含另一个 class 实例时,如何指定 numba jitclass?
How to specify numba jitclass when the class's attribute contains another class instance?
我正在尝试使用 numba 来提升 scipy.integrate.odeint 的 python 性能。
为此,我必须将 @nb.jit(nopython=True) 用于定义 ODE 系统的函数。但是,此函数必须将另一个 python-class 实例作为我程序中的参数。我还必须使用具有适当规格的 @nb.jitclass(spec) 来 jit class 。这工作得很好,直到我发现一个严重的问题,当 class 的规范包括另一种类型的 class 实例作为它的方法时。我的代码如下。
import numba as nb
from scipy.integrate import odeint
spec1=[("hi", nb.i4)]
@nb.jitclass(spec1)
class Hi(object):
def __init__(self):
self.hi = 0
spec2=[("dummy", nb.i4), ("dummy1", nb.i4)]
@nb.jitclass(spec2)
class Dummy(object):
def __init__(self, anotherClassInstance):
self.dummy = 0
self.dummy1 = anotherClassInstance
class A:
def __init__(self, someClassInstance):
self.a1 = someClassInstance
def odeSystem(self, x, t):
return _odeSystem(x, t, self.a1)
def odeSolve(self, iValues, ts):
sol = odeint(self.odeSystem, iValues, ts)
return sol
@nb.jit(nopython=True)
def _odeSystem(x, t, someClassInstance):
return 1-x
if __name__ == "__main__":
c = Hi()
b = Dummy(c)
a = A(b)
print a.odeSolve(0.5, range(0, 10))
总结:
所以这里 "class A" 是我的 ode 求解器。
要用numba编译方法"odeSystem",它不能是class方法。所以我在 class“_odeSystem”之外创建了另一个函数。
然而不幸的是,我的 odeSystem 必须有一个 class 实例作为参数。因此,我使用@jitclass 正确编译了 class 实例参数。
我又遇到了另一个问题,这个class"Dummy"也将另一种类型的class实例作为它的一个属性。我不知道如何为这个 class 设置 "spec"。我用 "nb.typeof(Hi)" 尝试了 "dummy1" 的类型,但它没有用。
请帮帮我。提前致谢。
您可以在规范定义中使用 .class_type.instance_type
来保存另一种类型的实例。请参阅 numba 源代码树中的示例 here
spec2=[("dummy", nb.i4), ("dummy1", Hi.class_type.instance_type)]
@nb.jitclass(spec2)
class Dummy(object):
def __init__(self, anotherClassInstance):
self.dummy = 0
self.dummy1 = anotherClassInstance
我正在尝试使用 numba 来提升 scipy.integrate.odeint 的 python 性能。 为此,我必须将 @nb.jit(nopython=True) 用于定义 ODE 系统的函数。但是,此函数必须将另一个 python-class 实例作为我程序中的参数。我还必须使用具有适当规格的 @nb.jitclass(spec) 来 jit class 。这工作得很好,直到我发现一个严重的问题,当 class 的规范包括另一种类型的 class 实例作为它的方法时。我的代码如下。
import numba as nb
from scipy.integrate import odeint
spec1=[("hi", nb.i4)]
@nb.jitclass(spec1)
class Hi(object):
def __init__(self):
self.hi = 0
spec2=[("dummy", nb.i4), ("dummy1", nb.i4)]
@nb.jitclass(spec2)
class Dummy(object):
def __init__(self, anotherClassInstance):
self.dummy = 0
self.dummy1 = anotherClassInstance
class A:
def __init__(self, someClassInstance):
self.a1 = someClassInstance
def odeSystem(self, x, t):
return _odeSystem(x, t, self.a1)
def odeSolve(self, iValues, ts):
sol = odeint(self.odeSystem, iValues, ts)
return sol
@nb.jit(nopython=True)
def _odeSystem(x, t, someClassInstance):
return 1-x
if __name__ == "__main__":
c = Hi()
b = Dummy(c)
a = A(b)
print a.odeSolve(0.5, range(0, 10))
总结: 所以这里 "class A" 是我的 ode 求解器。
要用numba编译方法"odeSystem",它不能是class方法。所以我在 class“_odeSystem”之外创建了另一个函数。
然而不幸的是,我的 odeSystem 必须有一个 class 实例作为参数。因此,我使用@jitclass 正确编译了 class 实例参数。
我又遇到了另一个问题,这个class"Dummy"也将另一种类型的class实例作为它的一个属性。我不知道如何为这个 class 设置 "spec"。我用 "nb.typeof(Hi)" 尝试了 "dummy1" 的类型,但它没有用。
请帮帮我。提前致谢。
您可以在规范定义中使用 .class_type.instance_type
来保存另一种类型的实例。请参阅 numba 源代码树中的示例 here
spec2=[("dummy", nb.i4), ("dummy1", Hi.class_type.instance_type)]
@nb.jitclass(spec2)
class Dummy(object):
def __init__(self, anotherClassInstance):
self.dummy = 0
self.dummy1 = anotherClassInstance