12

私は現在、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.pyxCythonでビルドしようとすると、次のエラーが発生します。

membraneClass.pyx:18:6: 'bendingForcesClass' is not a type identifier
building 'membraneClass' extension

宣言は 2 つの別々のファイルにあるため、これがさらに難しくなっていることに注意してください。

では、どうすればこれを実現できますか? 上記のリンク以外に、これに関する情報が見つからないため、誰かが私にポインタを与えることができれば非常に感謝しています.

よろしくお願いします!

4

3 に答える 3

2

これらはおそらくエラーの原因ではありませんが、問題を絞り込むために、次のように変更してみてください。

bendingForcesここで変数の名前として使用している可能性があります。

cpdef np.ndarray calculate( self, np.ndarray membraneHeight ) :
      cdef np.ndarray bendingForces
      bendingForces = self.matrixPrefactor * membraneHeight
      return bendingForces

また、ここでのメンバーオブジェクトの名前:

cdef class membraneClass( object ):
    cdef bendingForcesClass bendingForces

また、bendingForcesClassモジュールとクラスの名前です。最後に、ctypedefクラスからを作成してみbendingForcesClassませんか?

于 2011-03-18T15:12:48.053 に答える