python - 当类的属性包含另一个类实例时如何指定 numba jitclass?

标签 python scipy jit numba odeint

我正在尝试使用 numba 来提升 scipy.integrate.odeint 的 python 性能。 为此,我必须将 @nb.jit(nopython=True) 用于定义 ODE 系统的函数。但是,此函数必须将另一个 python 类实例作为我程序中的参数。我还必须使用具有适当规范的 @nb.jitclass(spec) 来调整类(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))

总结: 所以这里的“A 类”是我的 ode 求解器。

  1. 要用 numba 编译方法“odeSystem”,它不能是类方法。所以我在“_odeSystem”类之外创建了另一个函数。

  2. 不幸的是,我的 odeSystem 必须有一个类实例作为参数。因此,我使用@jitclass 来正确编译类实例参数。

  3. 我又遇到了另一个问题,这个类“Dummy”也将另一种类型的类实例作为其属性之一。我不知道如何为此类设置“规范”。我用“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

关于python - 当类的属性包含另一个类实例时如何指定 numba jitclass?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47667906/

相关文章:

python - 如何制作一个可以注销、关机和重启计算机的python脚本?

python - "/1/2/3/".split( "/")

python - 从 scipy.sparse.linalg.cg 中的回调打印当前残差

numpy - 仅沿一个轴进行卷积

python - 在循环中保存 Matplotlib 图时内存溢出

python - 将 groupby 值转换为数组列表

python - Python 中是否有提供变量积分限制(如 scipy)和高精度(如 mpmath)的多重积分器?

cuda - JCuda中的JIT,加载多个ptx模块

c++ - ebp + 6 而不是 JIT 编译器中的 +8

java - 我如何确定 Hotspot JVM 决定重新编译 JIT :ed code a second time? 的原因