Можно ли изменить переменную класса через ее имя в функции njit? - PullRequest
0 голосов
/ 16 апреля 2019

Я пытаюсь изменить переменную класса через его имя, поэтому в основном я вызываю функцию 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)

1 Ответ

1 голос
/ 17 апреля 2019

возможно ли изменить переменную класса через ее имя в функции njit?

Нет. В настоящее время (с numba 0.43.1) это невозможно с функциями numba в режиме nopython. Есть две причины, почему это не работает в вашем примере:

Однако на тот случай, если вас интересует, как вы можете установить атрибуты пользовательских классов (но не с динамическим именем), вы можете использовать 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 будет более эффективной - что, конечно, слишком упрощено, но послужило мне хорошим ориентиром в прошлом (см., Например, мой ответ на «Когда действует нумба?» ).

...