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でやりとりをさせるのは,高速化という観点からはよくないようだ.
モジュールを独立させれるなら,プロセス間で通信した方がいいのだろうか?

2014年5月17日土曜日

C, Java, Pythonでのたらい回し関数

CとJavaとPythonを業務で使ってみて,同じことをさせるプログラムを書くのに労力が全然異なる.Cと比べたらJavaはすごく楽で,Javaと比べたらPythonは楽だ.コーディングに要する時間が大きく変わる.特に,C言語はエラーチャックから全て行わなければならないし,標準ライブラリも貧弱で使いにくい.処理速度の問題さえ解決できれば,CなんてOS専用言語でアプリケーションには使用するべきではないと思う.

と思ったものの,実際CとJavaとPythonの性能がどの程度違うのか良く知らない.そこで,同じ処理をするプログラムを3種類の言語で作って性能を比較した.

たらい回し関数を計算するプログラムを作った.たらい回し関数は,

tarai_func_equation

と定義される.計算に時間がかかるだけの特に意味のない関数だ.

x, y, zの引数と試行回数を入力すると平均の計算時間を表示するプログラムを以下に示す.上から順にC, Java, Pythonである.エラー処理は最低のみで,異常があったら停止するようにしている.わざわざコードを貼るのは,ソースコードの分量の違いを示したいからである.なお,CはLinux環境用である.



C, Java, Pythonでそれぞれ行数は44, 24, 10行と開発規模が大きく異なる.実際作成にかかった時間もかなり異なる.

特に,Cのエラー処理は非常に面倒で,異常があったらとりあえず止まる,いわゆる「自働化」をさせるのにも工数を割かなければならない.今回はメモリを解放する必要がなかったが,メモリの管理を加えたらCのコードはさらに肥大化する.

Pythonが非常に簡潔なのは,timeitという実行時間測定のモジュールがあったことが大きい.また,Javaと比較して,いちいちクラスを作らなくてもいいということや,整数もクラスなので,Integerクラスのようなわかりにくいクラスがないことが規模を小さくしている.また,関数の引数や返り値の型を決めていないので,doubleでもそのまま使えるというメリットがある.逆に動かしてみないと動くかどうかわからないという問題はあるが,どうせテストするので大した欠点ではない.

Tarai(16, 8, 0)の10回の計算時間の平均値を比較すると,グラフのようになった.ちなみにJava, Pythonの環境はそれぞれOracle JDK7, Python 2.7である.

cpuTimeTarai16,8,0

結果を見ると,Cが最も速く,Pythonが非常に遅い.JavaとCを比較すると4倍程度の差なので,CPUがボトルネックになる場合以外はJavaを使用するべきだ言える.Pythonに関してはやはり遅すぎるので速度が問題になるのであれば,避けるべきだろう.しかし,速度が問題になるのでなければ,開発効率だけでなく,教育や保守に要する費用を考えるとPythonは積極的に使用するべきだろう.