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がいいのかはわかりませんが。
ソースコードも計測結果も無い文章でごめんなさい。
dll+ctypesの方のソース、削除しちゃったので;-(
あくまでメモと開き直って書き残します。