月曜日, 8月 24, 2009

PythonでC++コードを埋め込んで実行してみる

仕事でPythonコードを書いているのですが、かなり大きなデータファイル(500GB)を読み込んで解析計算をすることが望まれていて、実際の所相当な処理能力を求められつつあります。今手元にある2時間+α程度で作成したコードでは現実的な時間で処理することが難しいと思われます。このコードの処理時間を測定して、どの処理がどれくらい遅いのかを明らかにしながらボトルネックの高速化を図る必要があります。で、コードのいろいろな部分の計測を行いまして、for文を使って繰り返し計算を行う所が遅いという知見が得られました。で、これをどうするかが次の問題です。

C++で書いたコードを呼び出すような力技でいくのは効果があるかもしれないけど、学習時間と手間がしんどいだろうなと想像していました所、Scipy.weaveのinlineメソッドというものがあることをこちら(*1)で知りました。うまくいけば手間が掛からずにC++コードをマージすることができるかも、という淡い期待を抱き試してみることにしました。

うまくは行きましたが、それなりに落とし穴はありました。まず、Blitz(以前仕事で使っていたので懐かしいです)を使おうとするとUbuntu 9.04デフォルトのg++-4.3ではコンパイルできません。こちら(*2)にありますようにg++-4.2を読み出すと動きます。とりあえずg++-4.2から/usr/local/bin/(PATHの順序が/usr/bin/より先)へリンクを張ることで対処しました。

結構戸惑ったのは、コンパイルに失敗したときのエラーメッセージがPythonのものとg++のが入り混じってメッセージの可読性が非常に悪い事です。これはもう、慎重に書くか少しずつ書き足していくか、別にC++のみでコードを書き、十分にバグ取りをしてから持ち込む等をしないうまく行かないように思います。長いC++コードを書ける気がしません。

詳しいことはこちら(*3)こちら(*4)を参考にしました。

そうして書いたコードですが、確かに速くはなります。ですが、思った以上に呼び出しのオーバーヘッドが大きいようで、実行時間の短いコードを何度も呼び出すような使い方には向いていません。やはり実行時間の長いコードを丸投げするような使い方が良い様に思います。

*1 http://scipy.dip.jp/index.php?SciPy%2FWeave
*2 https://bugs.launchpad.net/ubuntu/+source/python-scipy/+bug/302649
*3 http://www.mpia.de/homes/tamburro/whatisthepython/weave/weave.html
*4 http://www.scipy.org/PerformancePython#head-3e5e0b392866d319bb08e78a4f184fca7d32e9bd

0 件のコメント: