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は積極的に使用するべきだろう.

0 件のコメント: