В настоящее время я пытаюсь оптимизировать свою программу на Python и начал работу с Cython, чтобы уменьшить накладные расходы на функционирование и, возможно, позже включить оптимизированные функции C-библиотек.
Итак, я столкнулся с первой проблемой:
Я использую состав в своем коде для создания более крупного класса. До сих пор я получил один из моих классов Python, преобразованный в Cython (что было достаточно сложно). Здесь код:
import numpy as np
cimport numpy as np
ctypedef np.float64_t dtype_t
ctypedef np.complex128_t cplxtype_t
ctypedef Py_ssize_t index_t
cdef class bendingForcesClass(object):
cdef dtype_t bendingRigidity
cdef np.ndarray matrixPrefactor
cdef np.ndarray bendingForces
def __init__(self, dtype_t bendingRigidity, np.ndarray[dtype_t, ndim=2] waveNumbersNorm):
self.bendingRigidity = bendingRigidity
self.matrixPrefactor = -self.bendingRigidity * waveNumbersNorm ** 2
cpdef np.ndarray calculate(self, np.ndarray membraneHeight):
cdef np.ndarray bendingForces
bendingForces = self.matrixPrefactor * membraneHeight
return bendingForces
Из моего составленного класса Python/Cython я вызываю метод класса calculate
, так что в моем скомпонованном классе у меня есть следующий (уменьшенный) код:
from bendingForcesClass import bendingForcesClass
cdef class membraneClass(object):
def __init__(self, systemSideLength, lowerCutoffLength, bendingRigidity):
self.bendingForces = bendingForcesClass(bendingRigidity, self.waveNumbers.norm)
def calculateForces(self, heightR):
return self.bendingForces.calculate(heightR)
Я обнаружил, что cpdef
делает метод/функции вызываемыми из Python и Cython, что отлично и работает, если я не пытаюсь заранее определить тип self.bendingForces
, который согласно требуется документация (Early Binding For Speed), чтобы удалить служебные служебные вызовы. Я пробовал следующее, что не работает:
from bendingForcesClass import bendingForcesClass
from bendingForcesClass cimport bendingForcesClass
cdef class membraneClass(object):
cdef bendingForcesClass bendingForces
def __init__(self, systemSideLength, lowerCutoffLength, bendingRigidity):
self.bendingForces = bendingForcesClass(bendingRigidity, self.waveNumbers.norm)
def calculateForces(self, heightR):
return self.bendingForces.calculate(heightR)
С этим я получаю эту ошибку при попытке построить membraneClass.pyx
с Cython:
membraneClass.pyx:18:6: 'bendingForcesClass' is not a type identifier
building 'membraneClass' extension
Обратите внимание, что объявления находятся в двух отдельных файлах, что затрудняет это.
Итак, как мне это сделать? Я был бы очень благодарен, если бы кто-то мог дать мне указатель, поскольку я не могу найти никакой информации об этом, кроме ссылки, приведенной выше.
Спасибо и с наилучшими пожеланиями!