hop*_*eso 4 python jit scipy odeint numba
我正在尝试使用numba来提升scipy.integrate.odeint的python性能.为此,我必须使用@ nb.jit(nopython = True)来定义ODE系统的函数.但是,这个函数必须在我的程序中将另一个python类实例作为参数.我还必须使用适当的规格与@ nb.jitclass(spec)一起使用jit.这很好,直到我发现一个严重的问题,当类的规范包括另一种类的实例作为其方法.我的代码如下.
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))
Run Code Online (Sandbox Code Playgroud)
总结:所以这里的"A级"是我的颂歌解决者.
要使用numba编译方法"odeSystem",它不能是类方法.所以我在"_odeSystem"类之外创建了另一个函数.
不幸的是,我的odeSystem必须有一个类实例作为参数.因此我使用@jitclass正确编译了类实例参数.
我再次遇到另一个问题,这个类"Dummy"也将另一种类实例作为其属性之一.我不知道如何为这个类设置"spec".我用"nb.typeof(Hi)"尝试了"dummy1"的类型,但它没有用.
请帮我.提前致谢.
您可以.class_type.instance_type在规范定义中使用来保存另一种类型的实例.看到numba源代码树例如这里
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
924 次 |
| 最近记录: |