最後に、私が本当に価値のある答えを出すことができる質問:)。
私は自分の仕事のためにf2py、boost.python、swig、cython、pyrexを調査しました(光学測定技術の博士号)。私はswigを広範囲に使用し、boost.pythonをいくつか使用し、pyrexとcythonを多く使用しました。ctypesも使用しました。これは私の内訳です:
免責事項:これは私の個人的な経験です。私はこれらのプロジェクトには関与していません。
swig:
c++ではうまく機能しません。そうすべきですが、リンク手順での名前マングリングの問題は、LinuxとMac OS Xでの私にとって大きな頭痛の種でした。Cコードがあり、Pythonに接続したい場合は、それが良い解決策です。私は自分のニーズに合わせてGTSをラップし、基本的に接続可能なC共有ライブラリを作成する必要がありました。私はそれをお勧めしません。
Ctypes:
ctypesを使用してlibdc1394(IEEE Camera library)ラッパーを作成しましたが、これは非常に簡単な体験でした。コードはhttps://launchpad.net/pydc1394にあります。ヘッダーをPythonコードに変換するのは大変な作業ですが、すべてが確実に機能します。これは、外部ライブラリとのインターフェースをとる場合に適した方法です。Ctypesもpythonのstdlibに含まれているため、誰でもすぐにコードを使用できます。これは、Pythonで新しいlibをすばやく試すための良い方法でもあります。外部ライブラリへのインターフェイスに推奨できます。
Boost.Python:とても楽しいです。Pythonで使用したい独自のC++コードがすでにある場合は、これを使用してください。この方法で、C++クラス構造をPythonクラス構造に変換するのは非常に簡単です。Pythonで必要なc++コードがある場合は、これをお勧めします。
Pyrex / Cython: PyrexではなくCythonを使用してください。限目。Cythonはより高度で、より楽しく使用できます。今日、私はSWIGやCtypesで行っていたcythonですべてを行っています。実行速度が遅すぎるPythonコードがある場合にも最適な方法です。プロセスは絶対に素晴らしいです:あなたはあなたのpythonモジュールをcythonモジュールに変換し、それらを構築し、それがまだpythonであったようにプロファイリングと最適化を続けます(ツールの変更は必要ありません)。次に、Pythonコードと混合したCコードをできるだけ多く(または少しだけ)適用できます。これは、アプリケーションのすべての部分をCで書き直すよりもはるかに高速です。内側のループを書き直すだけです。
タイミング:ctypesの呼び出しオーバーヘッドが最も高く(〜700ns)、次にboost.python(322ns)、次に直接swig(290ns)が続きます。Cythonは、呼び出しのオーバーヘッドが最も低く(124ns)、時間を費やす場所でのフィードバックが最も優れています(cProfileサポート!)。数値は、インタラクティブシェルから整数を返す簡単な関数を呼び出す私のボックスからのものです。したがって、モジュールのインポートオーバーヘッドはタイミングが設定されておらず、関数呼び出しのオーバーヘッドのみがタイミング設定されています。したがって、cythonをプロファイリングして使用することにより、Pythonコードを高速に取得するのが最も簡単で生産的です。
要約:問題については、Cythonを使用してください;)。この要約が一部の人々に役立つことを願っています。残りの質問には喜んでお答えします。
編集:言及するのを忘れています:数値的な目的(つまり、NumPyへの接続)にはCythonを使用します。彼らはそれをサポートしています(基本的にこの目的のためにcythonを開発しているため)。したがって、これはあなたの決定のための別の+1になるはずです。