私は、Python ラッパー (SWIG で記述) を備えた C++ ライブラリを持っています。このライブラリを使用すると、ベクトルの要素単位の演算など、小さなユーザー定義コード (コールバック) を実行できます。つまり、+ だけでなく、任意のバイナリ関数を実行できます。現在、これはバイナリ関数の呼び出し可能な Python オブジェクトを受け入れて呼び出すことで実現されています。これは機能しますが、反復ごとに Python にバウンスする必要がないコードよりも約 80 倍遅くなります。
C++ ライブラリから直接呼び出せるように、C++ ライブラリに渡すことができる Cython 関数をどのように記述/構築/インポートすればよいでしょうか?
編集:C言語だけを使うなら、次のように書くでしょう。
EWise(double (*callback)(double, double))
EWise はcallback(10, 20);
そうするでしょう。私はcallback
Cython で、ユーザーが望む名前を使って記述したいと思っています。そして、それへのポインターは、何らかの方法で Python を介して C++ ライブラリに渡される必要があります。どういうわけか、そこが私にはよく分かりません。
ベストアンサー1
Cythonのコツはキーワードを使うことです公共
cdef public double cython_function( double value, double value2 ):
return value + value2
次に、コマンドをcythonize <your_file.pyx>
一緒に実行すると、含めることができる<your_file.c>
ヘッダーが作成されます<your_file.h>
。または、ヘッダーを自分で作成することもできます。
#ifdef __cplusplus {
extern "C"
#endif
double cython_function( double value, double value2 );
#ifdef __cplusplus
}
#endif
アップデート:
そしてPythonのちょっとしたオーバーレイを使えばctypesのコールバックメカニズム
func_type = CFUNCTYPE(c_double, c_double, c_double)
your_library.set_callback_function ( func_type(user_modules.cython_function) )