Python и Numba имеют разные поведения с Jitclass и отложенным типом - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть следующий код Python, который я переношу в Numba:

class NODE(object):
    def __init__(self):
        self.left = self
        self.right = self
        print(self)
        print(self.left)
        print(self.right)

if __name__ == "__main__":
    n = NODE()
    print(n)
    print(n.left)
    print(n.right)

Для всех шести операторов печати я получаю одну и ту же строку, напечатанную шесть раз, что ожидается:

<__main__.NODE object at 0x1040aa668>
<__main__.NODE object at 0x1040aa668>
<__main__.NODE object at 0x1040aa668>
<__main__.NODE object at 0x1040aa668>
<__main__.NODE object at 0x1040aa668>
<__main__.NODE object at 0x1040aa668>

Однако, перенося это на Numba:

from numba import deferred_type, jitclass

node_type = deferred_type()
node_spec = [("left", node_type),
             ("right", node_type),
            ]

@jitclass(node_spec)
class NODE(object):
    def __init__(self):
        self.left = self
        self.right = self
        print(self)
        print(self.left)
        print(self.right)

node_type.define(NODE.class_type.instance_type)

if __name__ == "__main__":
    n = NODE()
    print(n)
    print(n.left)
    print(n.right)

Я получаю следующие операторы печати:

<numba.jitclass.boxing.NODE object at 0x1101df0f0>
<numba.jitclass.boxing.NODE object at 0x1101df0d0>
<numba.jitclass.boxing.NODE object at 0x1101df0f0>
<numba.jitclass.boxing.NODE object at 0x1101df0d0>
<numba.jitclass.boxing.NODE object at 0x1101df0f0>
<numba.jitclass.boxing.NODE object at 0x1101df0f0>

Обратите внимание, что:

  1. Они нене все одинаковые (я ожидаю, что они будут идентичны, как в примере только с Python)
  2. n равно self и n.left не равно self.left
  3. толькоn.right равно self.right, но оба они должны быть равны другим
...