16

C 関数を Python に接続する方法はたくさんあります: Python C APIscipy.weavectypespyrex/cythonSWIGBoost.PythonPsyco ... それぞれの最適な用途は何ですか? 他の方法ではなく特定の方法を使用する必要があるのはなぜですか? Python と C の間のバインディングを選択する必要がある場合、何を考慮する必要がありますか?

私はそれについていくつかの議論を知っていますが、それらはすべて不完全なようです...

StackOverflow に関するいくつかの質問も関連していることを知っています。例えば:

4

2 に答える 2

9

これらの方法をすべて使用したわけではありませんが、ある時点ですべてを調査しました...

Python C API: Python にインポートできる Python モジュールにコンパイルされる C コードを作成する場合。または、C ライブラリとのインターフェイスとして機能する「接着剤」コードとして機能する Python モジュールを作成する場合。

scipy.weave : C コードのビットを Python コードに押し込むことができます。数値計算を行うために NumPy と SciPy を使用している場合は、これを調べてください。C コードは、たとえば weave.inline('printf("%s", foo)') のような文字列になります。

ctypes : Python コードから C コードを呼び出すことができる Python モジュール。基本的に共有ライブラリをインポートしてから、その API を呼び出します。これらの呼び出しでデータをマーシャリングするためにいくつかの作業が必要でした。あなたまたは他の誰かが書いた既存の C ライブラリの使用を検討している場合は、ここから始めます。

pyrex/cython : C コード (Python モジュールとしてインポート可能) に生成される Python コードを (いくつかの特別な構文を使用して) 記述でき、明らかに、Python インタープリターを介して実行した場合よりも高速に実行できます。これは「Python C API」ルートのようなものですが、C コードを生成するだけです。ボトルネックであり、非常に遅いコードのチャンクがある場合に役立ちます。cython を使用してその関数を書き直し、呼び出し元のコードからインポートします。

SWIG : C/C++ ライブラリのラッパー コードを生成します。インポートして使用できる python モジュールが完成するはずです。

Boost.Python : これは私が最もよく知らないものです。SWIG に似ているように見えますが、ラッパー レイヤーを自分で作成しますが、Boost マクロ/関数の多くの助けを借りています。

Psyco : あなたの Python コードを少し高速化します。私はあなたの時間を無駄にしません。コードのプロファイルを作成し、ボトルネックを見つけて、上記の手法のいずれかを使用して高速化します。

于 2011-07-05T20:54:09.210 に答える
4

これは、質問の一部に対する簡単な回答にすぎませんが、次のとおりです。

ctypesPython で使用したい既存の C ライブラリがある場合は、おそらく最適です。

Python C API は、Python の側面を利用するものを C で作成する場合、または C で Python の拡張機能を作成する場合に最適です (Cython は、これを行う別の方法です)。

もちろん、どちらも、質問でリンクしている SO の質問に対する回答の一部で、より詳細に説明されている可能性があります。

于 2011-07-05T20:15:56.220 に答える