NUMBA JITCLASS:作为类成员的父类类型



考虑类dof及其子粒子组:

class dof():
    def getVar(self):
        return self.var
spec = [
    ('var', float64[:]),
    ('C_s', float64[:]),          
]
@jitclass(spec)
class particleGroup(dof):
    def __init__(self, partRelease):
        self.var = np.array([partRelease.Q, partRelease.M[0], partRelease.M[1], partRelease.M[2], partRelease.B, partRelease.x[0], partRelease.x[1], partRelease.x[2], 0])
        self.C_s = np.copy(partRelease.C_s)
    def getC(self):
        return self.C_s

partrelease对象的细节并不重要。

dof 是python类,因为numba不支持jitclass的继承。因此,在其上使用延期type插座。

dof 可以是不同子类的父母。我希望在另一堂课中使用 dof 类,我可以在其中调用父函数 getVar((

我的问题:如何在另一类中存储此类的实例(DOF类型或任何孩子类型(?在JitClass规范中要指定哪种类型?

然后:即使我可以指定父类类型,我怀疑对Python类的调用会很昂贵。有其他方法可以有效地进行多态性吗?使用模板而不是继承?

我找到了一个答案(至少是第二个问题(。

从模板中启发了一个解决方案。它包括不使用继承,而是在其接口中具有所需的共同函数的不同类别(此处 getVar (。

spec = [
('var', float64[:]),
('C_s', float64[:]),          
]
@jitclass(spec)
class particleGroup():
    def __init__(self, val, valCs):
        self.var = np.array([val, val, val, val])
        self.C_s = np.array([valCs, valCs*2, valCs*3, valCs*4])
    def getC(self):
        return self.C_s
    def getVar(self):
        return self.var
spec = [
    ('var', float64[:]),   
]
@jitclass(spec)
class otherDofType():
    def __init__(self):
        self.var = np.array([1.0, 0.0])
    def getVar(self):
        return self.var

如果某个类要将公共函数用于任何类型的对象,则可以将其定义封装在函数中:

def createUserClass(dofType, dofObject):
    dof_t = deferred_type()
    dof_t.define(dofType) 
    spec = [
        ('dof', dof_t),
    ]
    @jitclass(spec)
    class UserClass():
        def ___init__(self, dof):
            self.dof = dof
        def resetVar(self):
            a = dof.getVar()
            a[:] = 0   
    return UserClass(dofObject)

然后,我可以使用以下方式获取并使用USERCLASS实例:

particleGroupInstance = particleGroup(6.0, 2.0)
userObjectParticleGroup = createUserClass(particleGroup.class_type.instance_type, particleGroupInstance)
userObjectParticleGroup.resetVar()
otherDofTypeInstance = otherDofType()
userObjectOtherDofType = createUserClass(otherDofType.class_type.instance_type, otherDofTypeInstance)
userObjectOtherDofType.resetVar()

它有点重,但有效,应该比基于继承的任何解决方案更快...

最新更新