Python の拡張 - swig や Cython ではなく、swig に拡張する

swig を使用して他の言語のバインディングを生成する予定がない場合は、Boost.Python を検討する必要があります。

バインドする関数とクラスが多数ある場合、Py++ はバインドを作成するために必要なコードを自動的に生成する優れたツールです。

Pybindgen もオプションかもしれませんが、これは新しいプロジェクトであり、Boost.Python ほど完全ではありません。

編集:

長所と短所をもっと明確にする必要があるかもしれません.

    <リ>

    スウィッグ:

    長所:多くのスクリプト言語のバインディングを生成できます。

    短所:パーサーの動作が気に入らない。何らかの進歩があったかどうかはわかりませんが、2 年前の C++ パーサーはかなり制限されていました。ほとんどの場合、.h ヘッダーをコピー/貼り付けして % を追加する必要がありました

    また、(そうではない) 複雑な型変換のために、ときどき Python C-API を処理する必要がありました。

    私はもうそれを使用していません。

    <リ>

    Boost.Python:

    pro:非常に完成度の高いライブラリです。 C-API で可能なほとんどすべてのことを C++ で行うことができます。このライブラリを使用して C-API コードを記述する必要はありませんでした。また、ライブラリが原因でバグに遭遇したこともありません。バインディングのコードは、おまじないのように機能するか、コンパイルを拒否します。

    バインドする C++ ライブラリが既にある場合は、おそらく現在利用可能な最良のソリューションの 1 つです。しかし、書き直すべき小さな C 関数しかない場合は、Cython を試してみるとよいでしょう。

    短所:事前にコンパイルされた Boost.Python ライブラリがない場合は、Bjam (一種の make 置換) を使用することになります。私は Bjam とその構文が大嫌いです。

    B.P で作成された Python ライブラリは、肥満になる傾向があります。また、たくさんかかります それらをコンパイルする時間の。

    <リ>

    Py++ (廃止):Boost.Python を簡単に作成できます。 Py++ は C++ パーサーを使用してコードを読み取り、Boost.Python コードを自動的に生成します。また、その作者からも多大なサポートを受けています (いいえ、私ではありません;-) )。

    短所:Boost.Python 自体による問題のみ。更新:2014 年現在、このプロジェクトは中止されているようです。

    <リ>

    パイビンゲン:

    C-API を扱うコードを生成します。関数とクラスを Python ファイルに記述するか、Pybindgen にヘッダーを読み取らせてバインディングを自動的に生成させることができます (このために、Py++ の作成者によって作成された Python ライブラリである pygccxml を使用します)。

    短所:これは、Boost.Python よりも小規模なチームの若いプロジェクトです。まだいくつかの制限があります:C++ クラス、コールバックに多重継承を使用することはできません (ただし、自動的にコールバックを処理するカスタム コードを作成することはできます)。 Python 例外の C への翻訳。

    一見の価値があります。

    <リ>

    新しいパッケージ:2009 年 1 月 20 日、Py++ の作成者は、C/C++ コードと python をインターフェイスさせるための新しいパッケージを発表しました。これは ctypes に基づいています。まだ試していませんが、やってみます!注:このプロジェクトは、Py++ として廃止されたようです。

    <リ>

    CFFI:私はごく最近までこれの存在を知らなかったので、今のところ意見を述べることができません. Python 文字列で C 関数を定義し、同じ Python モジュールから直接呼び出すことができるようです。

    <リ>

    Cython:これは、私が現在プロジェクトで使用している方法です。基本的に、特別な .pyx ファイルにコードを記述します。これらのファイルは C コードにコンパイル (変換) され、CPython モジュールにコンパイルされます。Cython コードは通常の Python のように見えますが (実際、純粋な Python は有効な .pyx Cython ファイルです)、変数の型などの詳細情報を取得することもできます。このオプションの型指定により、Cython はより高速な C コードを生成できます。 Cython ファイル内のコードは、純粋な Python 関数だけでなく、C および C++ 関数 (および C++ メソッド) も呼び出すことができます。

    Cython で、同じコードで C と C++ の関数を呼び出したり、Python と C の変数を混ぜたりすることなどを考えるのに少し時間がかかりました。しかし、これは非常に強力な言語であり、活発な (2014 年時点) 友好的なコミュニティがあります。


SWIG 2.0.4 では、パフォーマンスを向上させる新しい -builtin オプションが導入されました。C++ 拡張機能を高速に呼び出すサンプル プログラムを使用してベンチマークを行いました。boost.python、PyBindGen、SIP、および SWIG を使用して拡張機能を構築しました。 -builtin オプションなし。結果は次のとおりです (100 回の実行の平均):

SWIG with -builtin     2.67s
SIP                    2.70s
PyBindGen              2.74s
boost.python           3.07s
SWIG without -builtin  4.65s

SWIG はかつて最も遅かった。新しい -builtin オプションを使用すると、SWIG が最速のようです。


確かに、これを手動で行うと常にパフォーマンスが向上しますが、これを行うために必要な労力と比較すると、その向上は非常に小さくなります。数値はありませんが、これはお勧めしません。インターフェイスを手動で維持する必要があり、モジュールが大きい場合は選択肢にならないからです!

迅速な開発を望んでいたため、スクリプト言語の使用を選択したのは正しいことでした。このようにして、初期の最適化シンドロームを回避し、ボトルネック部分を最適化したいと考えています。しかし、C/python インターフェースを手作業で行うと、確実に早期最適化症候群に陥ります。

より少ないインターフェイス コードが必要な場合は、C コードから dll を作成し、そのライブラリを cstruct を使用して Python から直接使用することを検討できます。

プログラムで Python コードのみを使用する場合は、Cython も検討してください。