Boost.Pythonを使う 第1回?
Pythonを使っていると,
Python遅い・・・ -> C++で一部のメソッドだけ実装したい
というシナリオはかなりの人が通る道だと思う. だが, その手段がありえぬ程多い・・・.
pythonとc++のインターフェイスの比較という記事を参考にした結果, とりあえずBoost.Pythonを使うことにした.
理由は,
- ファイル数が大して増えない(swigと比較して)
- 呼び出し側に汚い記述が入らない(ctypesと比較して)
- 変な言語覚えなくていい(Boostは最早変な言語みたいな気もするけど)
あたり. numpyのarrayも使えるし.(ドキュメントやばいけど)
公式チュートリアルを読めば大体わかるんだけど, まあ日本語メモとして. 以下, 環境はubuntu, コンパイラはg++, Boost.Pythonはaptから入れた後とします.
では, 簡単なプログラムから始めよう. まずC++側は
#include <boost/python.hpp> int add(int lhs,int rhs){ return lhs + rhs; } //BOOST_PYTHON_MODULE()の引数がmodule名 BOOST_PYTHON_MODULE(hello){ using namespace boost::python; def("add",add); }
このコードをコンパイルするには, 次のようなコマンドを使用する.
g++ -Wall -O2 -fPIC -c hello.cpp -I/usr/include/python2.6 g++ -shared -o hello.so -I/usr/include/python2.6 hello.o -lboost_python
ライブラリ作成時のコンパイルオプションはこちらのページが非常に参考になった. これをPythonから
import hello print hello.add(2,3)
という風に呼び出す. まあほとんど嵌るポイントはないけど, BOOST_PYTHON_MODULEの引数とライブラリのファイル名が一致していないと
ImportError: dynamic module does not define init function
みたいに怒られる.
まあ, 後はtutorialに従っていればいいかなぁ. 次回以降は嵌ったポイントを重点的に書き残すつもり.
いい加減なパフォーマンス比較とかもやったら残してみたいなぁ.