私は現在、Python プログラムを最適化しようとしており、関数呼び出しのオーバーヘッドを削減し、おそらく後で最適化された C ライブラリ関数を含めるために、Cython を使い始めました。
だから私は最初の問題に遭遇しました:
コードで構成を使用して、より大きなクラスを作成しています。これまでのところ、Python クラスの 1 つを 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)
メソッド/関数を Python と Cython から呼び出し可能にすることがわかりました。これは、事前cpdef
にタイプを定義しようとしない限り、素晴らしく機能します-ドキュメントによると (Early Binding For Speed)が必要です関数呼び出しのオーバーヘッドを取り除くために。次のことを試しましたが、うまくいきません。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
宣言は 2 つの別々のファイルにあるため、これがさらに難しくなっていることに注意してください。
では、どうすればこれを実現できますか? 上記のリンク以外に、これに関する情報が見つからないため、誰かが私にポインタを与えることができれば非常に感謝しています.
よろしくお願いします!