C++からCython関数を呼び出す 質問する

C++からCython関数を呼び出す 質問する

私は、Python ラッパー (SWIG で記述) を備えた C++ ライブラリを持っています。このライブラリを使用すると、ベクトルの要素単位の演算など、小さなユーザー定義コード (コールバック) を実行できます。つまり、+ だけでなく、任意のバイナリ関数を実行できます。現在、これはバイナリ関数の呼び出し可能な Python オブジェクトを受け入れて呼び出すことで実現されています。これは機能しますが、反復ごとに Python にバウンスする必要がないコードよりも約 80 倍遅くなります。

C++ ライブラリから直接呼び出せるように、C++ ライブラリに渡すことができる Cython 関数をどのように記述/構築/インポートすればよいでしょうか?

編集:C言語だけを使うなら、次のように書くでしょう。

EWise(double (*callback)(double, double))

EWise はcallback(10, 20);そうするでしょう。私はcallbackCython で、ユーザーが望む名前を使って記述したいと思っています。そして、それへのポインターは、何らかの方法で 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) )

おすすめ記事