【问题标题】:How to specify numba jitclass when the class's attribute contains another class instance?当类的属性包含另一个类实例时如何指定numba jitclass?
【发布时间】:2018-12-01 06:22:58
【问题描述】:

我正在尝试使用 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))

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

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

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

  3. 我又遇到了另一个问题,这个类“Dummy”也将另一种类型的类实例作为其属性之一。我不知道如何为这个类设置“规范”。我用“nb.typeof(Hi)”尝试了“dummy1”的类型,但没有成功。

请帮助我。提前致谢。

【问题讨论】:

  • 欢迎来到 SO!请更具体地说明您遇到了什么严重问题以及不起作用是什么意思? (预期与实际结果、错误消息等)。
  • @kazemakase 嗨,对不起我的含糊句子。这应该意味着当我想将类实例设置为当前类的属性时,“@jitclass(spec)”的“spec”参数不清楚。在我的代码中,“Dummy”类的“dummy1”是一种类实例对象。那么我应该为“spec2”中的“dummy1”设置什么?现在我只是将其设置为 ("dummy1", nb.i4) 但显然这不是 int 类型。所以当我运行这个文件时,它会出现一个很长的错误提示
  • 一个长错误说“[1] 期间:在 test.py(16) [2] 期间:解决被调用者类型:jitclass.Dummy#25a0a20 [3] 期间:在 (3) 处键入呼叫
  • 您可以将您的更新编辑到问题中吗?这将使它们更具可读性,并且会影响问题,增加知道答案的人可以看到它的机会。

标签: python scipy jit numba odeint


【解决方案1】:

您可以在规范定义中使用.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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多