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に従っていればいいかなぁ. 次回以降は嵌ったポイントを重点的に書き残すつもり.
いい加減なパフォーマンス比較とかもやったら残してみたいなぁ.