gpt4 book ai didi

python - 如何通过 njit 函数中的引用来修改类属性?

转载 作者:太空宇宙 更新时间:2023-11-03 13:57:16 25 4
gpt4 key购买 nike

我想更新 njit 函数内的类属性,但我事先不知道变量名称。为了说明这一点,我编写了以下代码

from numba import jitclass, jit, njit
from numba import int32, float64
import numpy as np

spec = [('A' ,float64),
('B' ,float64)]

@jitclass(spec, )
class myClass():
def __init__(self):
self.A = 1.
self.B = 1.
def add_A_and_B(self):
return self.A + self.B

class essai():
def __init__(self):
self.C = myClass()

def compute(self):
mystring = 'C.A' # parameter that I want update
nameclass, nameparam = mystring.split('.') # get the class name and the variable to update
tp = np.linspace(0, 100, num = 101)
val_A = np.linspace(0, 100, num = 101)
ref = getattr(getattr(self,nameclass),nameparam) # Doesn't work, trying to get a reference to a class attribute C.A
y= solve1(self.C,tp,ref,val_A) # pass the reference to the njit function to update C.A in the njit function
print(y)


@njit(fastmath=True)
def solve1(C,tp,param,paramvalues):
y = np.zeros(len(tp), )
for idx, t in enumerate(tp):
param=paramvalues[idx]
#C.A=paramvalues[idx] # what I expect the previous line to do
y[idx] = C.add_A_and_B()
return y

E=essai()
E.compute()

我要更新的变量是mystring = 'C.A'但在我的完整代码中,这来自用户输入。所以我想做的是获取该变量的引用,我尝试了 ref = getattr(getattr(self,nameclass),nameparam)但这行不通。一旦我有了这个引用,我就可以将它传递给 solve1 njit功能以更新 C.A里面njit功能。所以我运行了我得到的代码

[ 2.  2.  2.  2.  2.  2.

而不是

[   1.    2.    3.    4.    5. .... 

如果我使用C.A=paramvalues[idx]solve1功能。

所以问题是如何更新属性 AC里面 njit函数通过使用包含我想要更新的变量名称的字符串(在我的例子中 mystring = 'C.A' )

最佳答案

1) 引用,因为您希望能够通过直接分配给它来使用它 (param=...) 在 python 中不存在。分配给不带点或 [] 修饰符的左值总是会重新绑定(bind)该名称,无论是否在 numba 中。编辑:澄清一下,如果名称用 global (对于全局变量)或 nonlocal (对于封闭变量)标记,则不正确,但两者都不适用于此处。

2)在nopython模式下,numba需要在编译时知道您要分配给哪个属性(本质上是计算c结构的偏移量),所以我认为您能做的最好的事情就是编译两个版本函数。

关于python - 如何通过 njit 函数中的引用来修改类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49508769/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com