我正在尝试通过其名称修改类的变量,所以基本上我所做的就是调用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)
是否可以通过njit函数中的名称更改类变量?
目前(使用numba 0.43.1)使用nopython-mode numba函数是不可能的。有两个原因导致它在您的示例中不起作用:
numba.jitclass
除外)。setattr
(参见"Built-in functions" section in "Supported Python features" in the numba documentation)。但是,如果您对如何设置自定义类的属性感兴趣(但不能使用动态名称),则可以使用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?"上的答案) )。