Usando código Cython auto-definido de outro código Cython
tualmente, estou tentando otimizar meu programa Python e comecei a usar o Cython para reduzir a sobrecarga de chamada de função e, talvez mais tarde, incluir funções otimizadas de bibliotecas
Então eu corri para o primeiro problema:
Estou usando composição no meu código para criar uma classe maior. Até agora, consegui converter uma das minhas classes Python para Cython (o que já era bastante difícil). Aqui está o código:
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
Da minha classe Python / Cython composta, estou chamando o método de classecalculate
, para que, na minha classe composta, tenha o seguinte código (reduzido):
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)
Eu descobri quecpdef
faz com que o método / funções possa ser chamado de Python e Cython, o que é ótimo e funciona, desde que eu não tente definir o tipo deself.bendingForces
de antemão - que, de acordo com documentação (Early Binding For Spee é necessário para remover a sobrecarga de chamada de função. Eu tentei o seguinte, que não funciona:
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)
Com isso, recebo esse erro ao tentar criarmembraneClass.pyx
com Cython:
membraneClass.pyx:18:6: 'bendingForcesClass' is not a type identifier
building 'membraneClass' extension
Observe que as declarações estão em dois arquivos separados, o que dificulta iss
Então, como faço para fazer isso? Ficaria muito grato se alguém pudesse me dar um ponteiro, pois não consigo encontrar nenhuma informação sobre isso, além do link fornecido acim
Obrigado e cumprimentos