Numba — копия экземпляра jitclass

Как я могу сделать копию экземпляра numba jitclass (переменные которого являются numpy скалярами и массивами)?

Есть ли лучший способ, кроме создания нового экземпляра и копирования всех переменных в цикле? Я также пробовал copy.copy и copy.deepcopy, но оба терпят неудачу с TypeError: can't pickle MyJitClassName objects


person nivniv    schedule 27.11.2017    source источник


Ответы (1)


Я полагаю, что в принципе это то, что numba может поддерживать (рассмотрите возможность открытия проблемы), но для теперь я думаю, что единственный вариант - определить свой собственный.

Обратите внимание, что jitclasses содержат ссылки на массивы, поэтому, если вы хотите скопировать базовые данные, необходимо использовать array.copy().

from numba import jitclass, float64
spec = [
    ('scalar', float64),
    ('array', float64[:]),
]

@jitclass(spec)
class MyJitClass:
    def __init__(self, scalar, array):
        self.scalar = scalar
        self.array = array

    def copy(self):
        return MyJitClass(self.scalar, self.array.copy())
person chrisb    schedule 27.11.2017
comment
Это то, что я закончил, только инициализировав пустой новый экземпляр и зациклив все переменные в specs и проверив if isinstance(var, numba.types.npytypes.Array): setattr(new_instance, var, getattr(self, var).copy()). Как вы упомянули, это не идеально - person nivniv; 27.11.2017