Я начал изучать Cython как способ ускорить некоторый код. Одна вещь, которую я хотел бы сделать, это создать класс Cython, который представляется в виде структуры, чтобы помочь создать чистый код.
У меня есть следующая структура папок:
+ test_package
+ - a.pxd
+ - a.pyx
+ setup.py
a.pxd
:
from libc.stdint cimport uint8_t
cdef class ClassA:
cdef readonly:
uint8_t a_attribute
uint8_t b_attribute
uint8_t c_attribute
cdef uint8_t get_a(self)
cdef uint8_t get_b(self)
cdef uint8_t get_c(self)
a.pyx
:
from libc.stdint cimport uint8_t
cdef class ClassA:
def __cinit__(self):
self.a_attribute = 0x00
self.b_attribute = 0x01
self.c_attribute = 0x02
cdef uint8_t get_a(self):
return self.a_attribute
cdef uint8_t get_b(self):
return self.b_attribute
cdef uint8_t get_c(self):
return self.c_attribute
cdef ClassA make_ClassA():
cdef ClassA A = ClassA()
A.a_attribute = 0x12
return A
setup.py
:
from setuptools import Extension, setup
from Cython.Build import cythonize
extensions = [Extension("test_package", ['test_package/*.pyx'])]
setup(
ext_modules=cythonize(extensions, annotate=True),
compiler_directives={'language_level' : "3"},
)
Я могу запустить python3.7 setup.py build_ext --inplace
, чтобы построить это. Когда я смотрю на a.html
, я вижу что-то вроде этого:
![a.html](https://i.stack.imgur.com/TIrq4.png)
Есть ли причина, по которой он преобразуется в Python объекты? Например:
self.a_attribute = 0x00
if (__Pyx_PyObject_SetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_a_attribute, __pyx_int_0) < 0) __PYX_ERR(1, 5, __pyx_L1_error)
может ссылаться на __pyx_v_self
, но все равно преобразует его в Python объект. Я могу заставить многие свои методы скомпилировать код C, но меня больше всего беспокоит что-то вроде этого:
![enter image description here](https://i.stack.imgur.com/X0fuO.png)
i, j, k
циклы компилируются в C, но доступ к переменной struct по-прежнему является ссылкой на объект Python.
Другой вариант - я могу сделать что-то вроде этого:
![enter image description here](https://i.stack.imgur.com/QTrUO.png)
Но, очевидно, это все равно будет отображаться как Python код, основанный на всем, что я показал выше. Так почему это? Я неправильно использую cdef class
или это только то, что происходит при доступе к атрибутам cdef class
?