Я пытаюсь использовать Cython для ускорения симуляции. Частично это написание некоторых классов расширения. Я попробовал следующие варианты.
# cython: language_level=3
import cython
@cython.cclass
class Location1:
"""A patch of land with resources."""
cython.declare(resources=cython.double)
cython.declare(max_resources=cython.double)
def __init__(self, resources):
self.max_resources = resources
self.resources = resources
l1: Location1 = Location1(1)
print(l1.resources)
@cython.cclass
class Location2:
"""A patch of land with resources."""
resources = cython.declare(cython.double)
max_resources = cython.declare(cython.double)
def __init__(self, resources):
self.max_resources = resources
self.resources = resources
l2: Location2 = Location2(2)
print(l2.resources)
&
@cython.cclass
class Location3:
"""A patch of land with resources."""
resources = cython.declare(cython.double, visibility="public")
max_resources = cython.declare(cython.double, visibility="public")
def __init__(self, resources):
self.max_resources = resources
self.resources = resources
l3: Location3 = Location3(3)
print(l3.resources)
&
@cython.cclass
class Location4:
"""A patch of land with resources."""
resources: cython.double = 0.0
max_resources: cython.double = 0.0
def __init__(self, resources):
self.max_resources = resources
self.resources = resources
l4: Location4 = Location4(4)
print(l4.resources)
Варианты 1 и 2, очевидно, терпят неудачу из-за видимости атрибутов. Вариант 3 работает. Но на самом деле, я бы предпочел вариант 4, потому что до добавления Cython мой код был полностью аннотирован типом, и это несколько раз помогало мне находить ошибки, поэтому я хотел бы сохранить его таким. Но этот вариант приводит к
Traceback (most recent call last):
[...]
File "/usr/lib/python3.8/site-packages/Cython/Compiler/ExprNodes.py", line 2286, in generate_assignment_code
assert entry.type.is_pyobject, "Python global or builtin not a Python object"
AssertionError: Python global or builtin not a Python object
, что крайне разочаровывает, потому что документы Cython предлагают именно такой синтаксис (я проверял, мой Cython - версия 0.29.16 и, следовательно,> = 0.27). Существует директива компилятора для de ее активации, поэтому я предположил, что она должна работать.
Я что-то не так делаю, или это ошибка в Cython?