为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

梦里花落0921 2022-01-11 19:38:12
我试图通过它的名字来修改一个类的变量,所以基本上我所做的就是调用setattr函数。我的问题是当我试图用numba njit装饰器做到这一点时,它不再起作用了。那么有没有办法在里面做同样的事情numba?import numba as nbclass 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 nbclass 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 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

是否可以通过 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 更有效 - 这当然是过度简化但在过去为我提供了很好的指导(例如参见我的回答“什么时候 numba 有效?”)。


查看完整回答
反对 回复 2022-01-11
  • 1 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信