ページ

2011年5月3日

pypyは本当に速いのか?試してみた

pypy1.5がリリースされました。JITコンパイラを搭載するなどしていてCPythonより速いという触れ込みです。何もしなくても自分のプログラムが高速になっていくというのはとっても楽です。でも、pypyって日本語で響きは卑猥なのでちょっと避けてました。嘘です。
では、本当に速くなるのか、というのをフィボナッチ数列を計算する例のプログラムで試してみます。今回は再帰するコードと再帰しないで計算するコードの二つで計測しています。それから、参考までにJavaの計測時間ものせています。ただし、本来のJavaのコードがそうであるように、Fibonacciを計算するファクトリクラスを作って、何とかパターンでごにょごにょごにょ、っていうのはやっていません。誰かエンタープライズ用途で計算する壮大なプログラムを書いてください。さて、それでは今回計測したコードたちです。

さて、今回はPythonはpypy1.5, python2.7, python 2.6, python 2.5で計測しました。pypyとpython2.7はhomebrewでインストールしたものです。python2.6と2.5はもともとシステムについていたものです。Javaは1.6.0.24で64bitのサーバVMです。マシンは例のiMacです。確かCore i5の2.8Gで4 core。メモリは12Gです。結果はすべて秒です。再帰版では
  • python 2.5 1.46
  • python 2.6 0.94
  • python 2.7 1.03
  • pypy 1.73
  • java 0.55

です。python 2.5から2.6ではパフォーマンスがあがっていますが、2.7では若干落ちています。ビルド元が違うせいなのか、そういうものなのか・・・。Javaはさすがに無駄なことをやらなければ速いです。2倍ぐらい速いです。本命のpypyですが、1.7倍ぐらい遅くなっています。全然速くないです、というか遅いです。この結果が予想を裏切って悲しかったのでコードの書き方を変えれば速くなるかも?ということでループで書いてみました。計算が速すぎるのでループの数は再帰版とは違っています。その結果です。
  • python 2.5 6.33
  • python 2.6 5.51
  • python 2.7 3.12
  • pypy 2.34
  • Java 1.43
今回は、Pythonはバージョンが上がるたびに確実に速くなっています。そしてpypyはCPython 2.7よりさらに速くなっています。さて、みんなが大嫌いな大好きJavaは1.43秒と、やっぱり、圧倒的な速さです。

pypyは関数の呼び出しが高速になっているって聞いていたので、関数呼び出しがある再帰版のほうがCPythonより速くなりやすいと思っていたのですが、想像を裏切られました。ループの方がJITに優しいのでしょう。

でわでわ

0 件のコメント: