Как использовать jitclass, если члены класса являются dict и другим объектом класса - PullRequest
1 голос
/ 04 июня 2019

Я хочу использовать jitclass, чтобы ускорить мой код.Я определил класс B, имеет 2 переменных-члена.Один - это диктат, другой - объект класса А. Как определить спецификацию?Я застрял здесь на некоторое время.Спасибо.

У меня есть это:

TypeError: значения спецификации должны быть экземплярами типа Numba, получено

Ниже приведен код:

class A(object):
    pass

spec = [
    ('x', dict),  # ------ how to write this line ?
    ('y', A),  # ------ how to write this line ?
]

@jitclass(spec)
class B(object):
    def __init__(self):
        self.x = dict()
        self.y = A()

1 Ответ

0 голосов
/ 04 июня 2019

Вы не можете указывать элементы jitclass, которые не имеют явного типа numba. Вы можете сделать это, однако, если A также является jitclass, а dict не является стандартным диктоном Python, а вместо этого является диктатом, набираемым с помощью numba (numba.typed.Dict). Типизированный dict поддерживается только в numba версии 0.43 и новее:

import numba as nb


@nb.jitclass([('x', nb.float64)])
class A(object):
    def __init__(self, x):
        self.x = x

a_type = nb.deferred_type()
dict_type = nb.deferred_type()
spec = [
    ('x', dict_type),
    ('y', a_type), 
]

a_type.define(A.class_type.instance_type)
dict_type.define(nb.typeof(nb.typed.Dict.empty(key_type=nb.int64, value_type=nb.float64)))

@nb.jitclass(spec)
class B(object):
    def __init__(self, x, y):
        self.x = x
        self.y = y

a = A(3.0)
d = nb.typed.Dict.empty(key_type=nb.int64, value_type=nb.float64)
d[1] = 1.1
b = B(d, a)
print(b.y.x)   # => 3.0
print(b.x[1])  # => 1.1

Независимо от того, хотите ли вы или можете использовать jitclass для A или nb.typed.Dict вместо питона dict, будет зависеть от вашего конкретного варианта использования.

...