https://numba.readthedocs.io/en/stable/user/jitclass.html
Numba supports code generation for classes via the numba.experimental.jitclass() decorator. A class can be marked for optimization using this decorator along with a specification of the types of each field. We call the resulting class object a 'jitclass'. All methods of a jitclass are compiled into nopython functions.
@classmethod and special methods are not supported.
Numpy arrays with 'dtype=object' are not supported in 'nopython mode'.
import numpy as np
from numba import types # import the types
from numba.experimental import jitclass
spec = [('value', types.int64), # a simple scalar field
('array', types.float64[:]), # an array field
] # the order is in agreement with __init__
@jitclass(spec)
class Bag(object):
def __init__(self, value):
# the fields should be initialized
self.value = value
self.array = np.zeros(value, dtype=np.float64)
@property
def size(self):
return self.array.size
def increment(self, val):
for i in range(self.size):
self.array[i] += val
return self.array
@staticmethod
def add(x, y):
return x + y
n = 5
mybag = Bag(n)
print(mybag.array) # [0. 0. 0. 0. 0.]
print(mybag.size) # 5
print(Bag.add(1,2)) # 3
# Specifying 'numba.typed' containers as class members.
# (1) Using explicit Numba types and explicit construction.
# (2) Using numba.typeof(), pobieranie typu z istniejÄ…cej instancji.
from numba import types, typed
from numba.experimental import jitclass
spec = [('d', types.DictType(types.int64, types.unicode_type)),
('lst', types.ListType(types.float64)),
] # the order is in agreement with __init__
@jitclass(spec)
class ContainerHolder(object):
def __init__(self):
# initialize the containers
self.d = typed.Dict.empty(types.int64, types.unicode_type)
self.lst = typed.List.empty_list(types.float64)
container = ContainerHolder()
container.d[1] = "apple"
container.lst.append(12.3)