Pythonコードの高速化ソリューションはいろいろあるけど,実際に試してみたらPyPyが一番速かった,という話。
Speed up your Python: Unladen vs. Shedskin vs. PyPy vs. Cython vs. C
エントリのブログ主は,プロトタイピング段階でPythonで書いたコードを,Shedskin,Cython,Unladen SwallowとPyPyを使ってどのくらい高速化するかベンチマークを取ってみた。ShedskinはPythonのコードをC++に,CythonはCにコンパイル。UnladenとPyPyはJITを使って実行を高速化する。
結果は以下のようになった。
Pure Python | 59.174s |
Shedskin | 1m18.428s |
Cython | 39.824s |
Unladden Swallow | 44.050s |
PyPy | 10.316s |
PyPyはRPythonという文法的にちょっとした制約があるPythonを使う必要がある(大抵のコードはそのまま動くらしいけど)。そういう制限があったとしても,ほぼPurePythonなコードをPyPyで動かすだけでここまで高速化できるというのは驚きだ。
今年の夏に行ったEuroPython 2010でPyPyのセッションで,ちょうどJITの作者Antonio Cuniさんが話してた。トークが終わった後「PyPyのJITはなんで速いの?」との質問に答えてAntonioさん曰く「オブジェクトが持っているデータをメモリ上の固定位置に配置してるのが効いているみたい」と言っていた。この質問をしたのは実はセッションを聞きに来てたGuidoで,彼自身もPyPyにとっても興味があるみたい。
動的型付け言語の高速化手法はいろいろあるけど,PyPyのアプローチは副作用も少ないし,straightforwardでかつ実際に成功を収めている数少ない例だと思う。あと数年もすると,Pythonのコードがほぼそのまま5倍とか場合によっては100倍の速度で動くような時代が来るかもね:-)。