如果类的属性包含另一个类实例,如何指定numba jitclass?

时间:2017-12-06 06:13:17

标签: python scipy jit numba odeint

我试图使用numba来提升scipy.integrate.odeint的python性能。 为此,我必须使用@ nb.jit(nopython = True)来定义ODE系统的函数。但是,这个函数必须在我的程序中将另一个python类实例作为参数。我还必须使用适当的规格与@ nb.jitclass(s​​pec)一起使用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级"是我的颂歌解决者。

  1. 编译方法" odeSystem"与numba一样,它不能是一个类方法。所以我在课堂之外做了另一个功能" _odeSystem"。

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

  3. 我又遇到了另一个问题,这个班级" Dummy"还将另一种类实例作为其属性之一。我不知道如何设置" spec"为了这堂课。我试过" dummy1"用" nb.typeof(Hi)"但它没有用。

  4. 请帮帮我。提前谢谢。

1 个答案:

答案 0 :(得分:5)

您可以在规范定义中使用df %>% group_by(Species) %>% summarise_at(vars(ex.fa), funs(mean, sd(.,na.rm = TRUE))) 来保存其他类型的实例。请参阅numba源代码树here

中的示例
.class_type.instance_type