我目前正在尝试优化我的 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 类中,我调用了 class-method 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
请注意,声明位于两个单独的文件中,这使得这更加困难。
那么我该怎么做呢?如果有人能给我指点,我将非常感激,因为除了上面给出的链接之外,我找不到任何关于此的信息。
谢谢和最好的问候!