Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以通过njit函数中的名称更改类变量?_Python_Class_Numba - Fatal编程技术网

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

Python 是否可以通过njit函数中的名称更改类变量?,python,class,numba,Python,Class,Numba,我试图通过类的名称修改它的变量,所以基本上我要做的就是调用setattr函数。 我的问题是,当我试图用numbanjit装饰器来做这件事时,它不再工作了 那么,在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) tes

我试图通过类的名称修改它的变量,所以基本上我要做的就是调用
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\u 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模式的numba功能中是不可能的。在您的示例中,它不起作用的原因有两个:

  • 在nopython模式下,numba只支持数量非常有限的类。不支持自定义类(numba.jitclass除外)
  • setattr
    完全不受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更高效——这当然过于简化了,但在过去曾作为我的一个很好的指导方针(例如,请参见我的答案)。

您确定要做
A=A()
?看起来脏兮兮的,“不行”到底是什么意思?我从
numba
本身收到一个键入错误。它崩溃了,并显示一条大消息:此错误可能是由以下参数引起的:-参数0:无法在
setattr(a,s,1)
行确定numba类型我的问题是我想更改类的一些变量,但我不知道是哪些变量。但正如您所说,这似乎是不可能的。是否可以调用一个函数(
update\u var
)来执行
@nb.njit
test
函数中的
setattr
),但该函数(
update\u var
)将不会被编译?我在问题中添加了信息。@ymmx因为这是一个单独的问题,我建议问一个新问题。更改问题的范围将使现有答案无效。然而,简短的回答是:不,这不可能,nopython函数中的所有内容也必须是nopython(包括函数调用)。@ymmx再次强调:如果你想在自定义类上操作,那么不要使用numba,这不是numba(通常)擅长的。我理解。我对Cython不是很熟悉,所以我宁愿选择numba,但我会尝试一下。谢谢你的回答