PythonのC++拡張ライブラリの速度


PyMugenのPalFxをPure Pythonで作ったら、遅くてお話になりませんでした。


(PalFx:キャラや背景画像のパレットにエフェクトを書ける命令。
色を反転させたり、青成分のみを取り出したりできる。)


単純な計算処理で、典型的な行列演算でもないので、
C++でDLLを書くことにしたのですが、方法が複数あります。


  • DLLを書いてctypesで呼ぶ

  • Boost.Python


の2つの選択肢がとりあえずありました。(生のCや、SWIGは、知らないので。)


両方で書いてみて、結局、Boost.Pythonを採用しました。


理由は、dll+ctypesが遅かったから。


C++での処理時間自体は大して変わらないのに、
全体の処理は10倍くらい違っていました。


恐らく、ctypesではPythonオブジェクトを直接渡す事は出来無い事が原因です。
PalFxの場合、パレットのデータであるRGBのlist [(r1, g1, b1), (r2, g2, b2), ...] を、
構造体の配列に変換して渡し、戻り値の配列を再びlistに変換する処理が必要です。


やはりctypesは既存のライブラリを利用するためのもので、
新規に作るならDLLではなく、拡張を書いた方がよいようですね。
Boost.Pythonがいいのかはわかりませんが。

PyCXXとか
Cython
なんてものもあるみたいです。


ソースコードも計測結果も無い文章でごめんなさい。

dll+ctypesの方のソース、削除しちゃったので;-(

あくまでメモと開き直って書き残します。