是否可以通过njit函数中的名称更改类变量?

时间:2019-04-16 14:47:50

标签: python class numba

我正试图通过其名称来修改类的变量,因此基本上我所做的就是调用setattr函数。 我的问题是,当我尝试使用numba njit装饰器来执行此操作时,它不再起作用。

那么在numba中是否可以做同样的事情?

import numba as nb

class A():
    def __init__(self):
        self.a =0.

@nb.njit()
def test(A,s):
    setattr(A,s,1)

A = A()
s = 'a'
print(A.a)
test(A,s)
print(A.a)

更新

是否可以在test装饰器之外的@nb.njit函数内调用一个函数。在下面的示例中,var_update(A,s,1)函数无法编译?

import numba as nb

class A():
    def __init__(self):
        self.a =0.

    def set_a(self,a):
        self.a=a

@nb.njit()
def test(A,s):
    var_update(A,s,1) # this function could not be compiled?

def var_update(Obj, s , val):
    setattr(Obj,s,val)

CA = A()
s = 'a'
print(CA.a)
test(CA,s)
print(CA.a)

1 个答案:

答案 0 :(得分:1)

  

是否可以在njit函数中通过其名称更改类变量?

不。当前(使用numba 0.43.1)使用nopython-mode numba函数无法实现。在您的示例中它不起作用的原因有两个:

但是,如果您对如何设置自定义类的属性(而不是动态名称)感兴趣,可以使用jitclass

import numba as nb

@nb.jitclass([('a', nb.float64)])
class A():
    def __init__(self):
        self.a = 0.0

@nb.njit
def test(instance):
    instance.a = 1

A = A()
print(A.a)
test(A)
print(A.a)

请注意,如果您要使用自定义类和setattr,那么我的建议是在numba函数的外部中进行此操作。 Numba非常适合数字运算和数组处理,但它不是通用工具!如果您想要更通用的工具,那么Cython可能会更好。

根据我的经验:如果不是关于循环且不涉及数字或数组,那么不要指望numba会更高效-当然,这已经过分简化了,但在过去曾作为我的指导方针(例如参见在"When numba is effective?"上回答)。