Pythonより速いという触れ込みのPyPy。
実際どういうものなのでしょうか?
Google先生のお力を持ってしても日本語で、「こういうものだ!」と
説明してくれるのはWikipedia先生くらいしか見つかりません。
英語のサイトならブログ等で記事も比較的多かったのでがんばって
ちょっとまとめてみました。
注. 色々なドキュメントからの抽出、まとめですが訳や解釈が
間違っている可能性があります。ご指摘頂ければ修正・加筆します。
各参考サイト等
https://ja.wikipedia.org/wiki/PyPy
http://pypy.org/index.html
http://shomah4a.net/pypy-tutorial/
http://stups.hhu.de/mediawiki/images/f/f5/Tracing_JITs11_tracing_the_meta_level.pdf
Pythonの復習
PyPyの前に、まずPythonについて。
広く使われているいわゆるPythonとはC言語で実装されたCPythonを指します。
(他にもJavaVM上で動くJythonとか.Net上で動くIronPythonとかもあります)
そしてPyPyとはPythonで再実装された(セルフホスティング)Pythonです。
ではPyPyはCPythonで再実装されたPythonなのかというと、それでは70点です(適当な点数)。
RPython
話は変わりましてCPythonにはRPythonというサブセットが存在します。
サブセットというのはあるシステムやプログラミング言語の一部を取り出して
使えるようにしたもので、身近な例としてはVBAがVisualBasic6のサブセットです。
さらにRPythonの"R"はRistricted(制限された)です。
つまりRPythonはCPythonに制限・制約を加えてCPythonで再実装された
Pythonのサブセットです(難しい・・・)。
そしてPyPyはこのRPythonで実装されています。
結論としてPyPyとは、
C言語で実装されたCPythonのサブセットであるRPythonで実装されたPython
ということになります。
なぜわざわざRPythonを作ったのかという話はもう少し後で。
速さの秘密
PyPyの売り文句の一つとして、「CPythonより実行速度が速い」が挙げられます。
元が同じPythonなのになぜ速くなるのか。それはJITによるものです。
JITとは
"Just In Time Compiler"、実行時コンパイルです。
コンパイルにより関数単位、モジュール単位でマシン語に変換することにより
実行速度を上げます。(インタプリタは行単位の逐次実行)
※Wikipedia先生によるとPyPyは実行コードのコンパイルではなく処理系のコンパイルらしい
(JITそのものについては割愛します)
ちなみにRPythonは型推論が実装されており、
コンパイル時の最適化に寄与しているらしいです。
http://shomah4a.net/pypy-tutorial/
にはマシン語に変換するチュートリアルの解説がありますので興味があればぜひ。
(さらに補足)
チュートリアルに必要なPyPyは公式のBitBucketからMercurialでcloneします。
https://bitbucket.org/pypy/pypy
PyPy公式ダウンロードページにも説明がありますが、
上部にある実行環境用のバイナリとは別に、下の方にありますのでご注意ください。
また、RPythonだけなら普通にpipで落とせたりします。
この辺の導入方法は意外と情報が少ないです。
PyPyとCPythonの違い
PyPyはCPythonのコードと互換性を持たせるためにRPythonからさらに実装されましたが、
それでも差異があります。以下はその一部です。
- C言語で書かれたPythonライブラリが使えない
- ガベージコレクト方式が違う
C言語ライブラリが使えないのはRPython由来ですね。
ただNumPyとかはPyPy版もあるのである程度フォローはされているようです。
ガベコレは「参照カウントベースではない」と言い切ってはいるものの、
じゃあ何使ってるの?というのははっきりしない・・・
たぶんマーク・アンド・スイープだと思うんですけど(推測)。
ソース見れば一発なんですけどね(読むのむずかしい)
今日はここまで
以上そもそもPyPyのことを知らないという事情から調べてみましたが、
あまりまとめられていません。引き続き調査していきますのでネタが
溜まり次第またまとめていきます。