из-за редактирования исходного вопроса для использования PEP8 этот ответ немного не синхронизирован; прости за это.

тоящее время я пытаюсь оптимизировать свою программу на 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 заранее - который согласнодокументация (Раннее связывание для скорости) необходимо для того, чтобы удалить служебные вызовы функции. Я пробовал следующее, которое не работает:

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

Обратите внимание, что объявления находятся в двух отдельных файлах, что делает это более сложным.

Итак, как мне это сделать? Я был бы очень благодарен, если бы кто-то мог дать мне указатель, поскольку я не могу найти никакой информации об этом, кроме ссылки, приведенной выше.

Спасибо и всего наилучшего!

Ответы на вопрос(3)

Ваш ответ на вопрос