我尝试使用numba来提高scipy.integrate.odeint.
为此,我必须使用@nb.jit公司(nopython=True)用于定义ODE系统的函数。但是,这个函数必须在我的程序中使用另一个python类实例作为参数。我还得在课堂上@nb.吉特班(规范)具有适当的规范。这一切都很好,直到我发现一个严重的问题:类的规范包含另一种类型的类实例作为它的方法。我的代码如下。在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))
小结:
所以这里的“A级”是我的颂歌解算器。在要用numba编译方法“odeSystem”,它不能是类方法。所以我在类“uodesystem”之外做了另一个函数。
然而不幸的是,我的odeSystem必须有一个类实例作为参数。因此,我使用@jitclass正确编译类实例参数。
我又遇到了另一个问题,这个类“Dummy”还将另一种类型的类实例作为其属性之一。我不知道如何设置这个类的“规格”。我试过用“dummy1”这个词nb.类型(嗨)“但是没用。
请帮帮我。提前谢谢。在