簡體   English   中英

是否可以通過njit函數中的名稱更改類變量?

[英]is it possible to change a class variable through its name in a njit function?

我正在嘗試通過其名稱修改類的變量,因此基本上我要做的是調用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函數無法實現。 在您的示例中它不起作用的原因有兩個:

但是,如果您對如何設置自定義類的屬性(而不是動態名稱) jitclass可以使用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何時有效?” )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM