【发布时间】:2011-07-16 21:43:09
【问题描述】:
我目前正在尝试优化我的 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 的类型 - 根据 @ 987654321@ 是必要的,以消除函数调用开销。我尝试了以下方法,但不起作用:
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)
在尝试使用 Cython 构建 membraneClass.pyx 时出现此错误:
membraneClass.pyx:18:6: 'bendingForcesClass' is not a type identifier
building 'membraneClass' extension
请注意,声明位于两个单独的文件中,这使得这更加困难。
那么我该怎么做呢?如果有人能给我指点,我将非常感激,因为除了上面给出的链接之外,我找不到任何关于此的信息。
谢谢和最好的问候!
【问题讨论】:
-
我想看看问题出在哪里,如果有问题请及时通知我们!
-
我意识到这是一个老问题,但我现在遇到了一个非常相似的问题。你有想过这个吗?
-
没有。不幸的是,我从未解决过这个问题,因为在某些时候这部分代码与我的项目无关。无论如何,我祝你好运,如果你弄明白了,把它贴在这里,我很乐意接受它作为正确答案。
-
经过大量搜索,我找到了这个完美的答案:stackoverflow.com/questions/33616927/…
标签: python class methods composition cython