2014年5月18日日曜日

C-Python間のたらい回し

前回「C, Java, Pythonでのたらい回し関数」にて,C, Java, Pythonの生産性と性能を比較した.Cは面倒だが速い;一方でPythonは楽だが遅いということがわかった.
そうならば,全てCで書くのはだるいから,性能に影響しないところはPythonで書いてやれとなるかもしれない.あるいは,既存のCで書かれたプログラムを拡張するのに,Pythonを使うという場面もあるだろう.Pythonには,Javaと同じようにCと行ったり来たりするためのインターフェイスが用意されている.
そこで,CとPythonの間でたらい回しが行われるような,たらい回し関数の計算を行ってみた.
下の式のようなイメージで,Tarai_CをC,Tarai_PyをPythonで計算する.
tarai_func_equation2
ソースコードは以下のとおり.tarai.cとtaraiC.cからtaraiCmodule.soという名前の共有ライブラリをつくると,PythonからはtaraiCモジュールとして見える.上のTarai_C(x,y,z)がtaraiC.taraiToPython(x,y,z),Tarai_Py(x,y,z)がtarai.taraiToC(x,y,z)に相当する.

Tarai_C(12, 6, 0)とTarai_Py(12, 6, 0)の計算時間をグラフに示す(それぞれ項目C-Python, Python-C).参考として,通常のたらい回し関数をCのみ,Pythonのみで実行した場合の時間も示す.
cpuTimeC-Py
Tarai_C(12, 6, 0)とTarai_Py(12, 6, 0)の計算時間はほぼ同じであった.
Pythonのみより遅くなっているのは,Tarai_Cにて関数の呼び出し毎にモジュールのインポートを行っているからである.最初の1回のみ呼び出す方法もあるのだろうけど,ちょっと分からなかった.通常CとPythonを組み合わせるときにこんな使い方はしないだろうけど,非常に頻繁にPythonとCでやりとりをさせるのは,高速化という観点からはよくないようだ.
モジュールを独立させれるなら,プロセス間で通信した方がいいのだろうか?

0 件のコメント: