8

Scipy には、何らかの操作を実行するために python callable を受け入れる多くの関数があります。scipy.optimize.leastsq特に、目的関数の引数として Python callable を受け入れる数学的最適化関数を使用しています。この目的関数はleastsq、最小化プロセス中に何度も呼び出すことができます。

私のプロファイリングは、その目的関数に多くの時間が費やされていることを示しています。Cython を使用して関数の一部を高速化しました。ただし、関数自体は依然として Python 関数であり、繰り返し呼び出す (leastsqそうであるように) オーバーヘッドがいくらかあります。

cdef関数がCython関数(の代わりに使用)であれば、さらに高速化できると思いますdef。そのため、Cython 拡張機能の内部に呼び出しを配置しleastsq​​、Cython 目的関数をそれに渡します。しかし、これを行うと、呼び出し時にコンパイル エラーが発生します。 leastsq

Cannot convert 'object (object, object, object)' to Python object

Python callables を必要とするこれらの Scipy 関数に Cython 関数を引数として渡す方法はありますか?

または、私の場合、基になる実装にアクセスし leastsq て Cython 目的関数を渡す方法はありますか?

4

1 に答える 1

6

現在、関数を渡すcdefことはできません。Cython を認識しない f2py でラップされているため、基になる Fortran コードにコールバック関数を渡すこともできません。

あなたができることは次のとおりです。

  • 関数を Cython の関数として記述しdefます。これらは、すべての Scipy のルーチンに渡すことができます。これは、Python のコールバック メカニズムを使用することによる追加の関数呼び出しのオーバーヘッド (重要ではないかもしれません!) を取り除くものではありませんが、関数の実装を高速化することができ、これで十分かもしれません。cdefCython のコードを書くときはいつものように、 に現れる変数を覚えておいてください。

  • Scipy または netlib.org から MINPACK ソース コードをコピーし、それらを直接使用してください。これは、Python 関数コールバック メカニズムを低レベルのものに置き換えることで、残りの関数呼び出しのオーバーヘッドを取り除きます。

(この目的のために、低レベルの関数ポインターを渡すためのプロトコルを追加することについて議論がありました。これは、それを必要とする任意の Python ベースのシステムで採用できますが、私の知る限り、設計は完了しておらず、実装されていません。 Cython & Scipy.)

于 2012-10-12T15:06:16.740 に答える