PyPyが速いわけがわからない
SourceForge.JP Magazine によると、
性能を強化したPythonインタプリタ「PyPy 2.4」がリリース
なのだそうです。
今のところ、私は普通のPythonで足りているので、PyPyは使ったことはないのですが、なんだかこれ、普通のPythonよりも、速い、という意味不明な存在です。
文脈上、ここからは普通のPyhton を CPython と書いて区別します。
C言語で実装されているからCPythonですね。
で、問題のPyPyは、Pythonで実装されています。セルフホスティングというやつです。
まあ、CコンパイラもCで書かれたりしていますから、ありっちゃありですね。
で、あのおっそいPythonで実装されているのに、出来上がりのソフトの実行速度はなぜかCPythonよりも速いのです。
JVMのような実行時最適化が効いているから速いのかなと思っていたのですが、どうやらそうではないようです。
それなら、JVM上で動作するJythonだってもっと速くないといけませんからね。
でも現実はそうはなっていないです。
速さの秘密の一つは、実装に使われているPythonがCPythonではなくて、Pythonに色々と制約を加えたRPythonというものであるということです。
RPythonでは、すべての変数が型付けされます。
なので、RPythonで書かれたコードは静的な型付けコードに変換したうえでコンパイルすることができ、それで実行時のスピードが稼げているわけです。
だったら最初からRPythonで書いちゃえばいいじゃん、と思うのですが、実際に使った人によると、さすがにこれはこれで「使いにくい」のだそうです。
RPythonで、もっと使いやすい言語のインタプリタでも書いた方がいいっていうわけで、実際にPythonのインタプリタを書いてしまったのが、PyPyですね。
ちなみに、Rubyを実装したTopaz や、PHPを実装した、HippyVMなんてのも存在します。
で、最近のインタプリタ言語はインタプリタといいながら、JITコンパイラ搭載が当たり前、になってきています。
PyPyも然りです。
以上がどうもPyPyが速い理由なのだそうですが、じゃあ、だったらどうして、CPythonをやめて、全部PyPyにしてしまわないのか、今度はそちらが疑問に思えてきます。
また、落ち着いて考えると、PyPyと同等のJITをCPythonに実装してしまえば、実効速度が変わらない気もします。
だって、インタプリタ+JITをRPythonで書くのか、Cで書くのかの違いでしかないはずなのですから。
いよいよ謎の深まるPyPyなのでした。
ついでながら、確かもっと別の高速なPythonの実装があったはずだよなと思って調べ直してしまいました。
Cythonというのも世の中には存在します。
CPythonとは違ってCythonです。
これもPythonに、静的型付けを取り込んだような言語で、そこそこ高速です。
よくよく調べると、PyPy(RPython)と同じく、PythonのJITコンパイラ、Psycoから派生したものだったのですね。
以上、自分のメモも兼ねて、Pythonの方言関係を一巡りしておきました。
性能を強化したPythonインタプリタ「PyPy 2.4」がリリース
なのだそうです。
今のところ、私は普通のPythonで足りているので、PyPyは使ったことはないのですが、なんだかこれ、普通のPythonよりも、速い、という意味不明な存在です。
文脈上、ここからは普通のPyhton を CPython と書いて区別します。
C言語で実装されているからCPythonですね。
で、問題のPyPyは、Pythonで実装されています。セルフホスティングというやつです。
まあ、CコンパイラもCで書かれたりしていますから、ありっちゃありですね。
で、あのおっそいPythonで実装されているのに、出来上がりのソフトの実行速度はなぜかCPythonよりも速いのです。
JVMのような実行時最適化が効いているから速いのかなと思っていたのですが、どうやらそうではないようです。
それなら、JVM上で動作するJythonだってもっと速くないといけませんからね。
でも現実はそうはなっていないです。
速さの秘密の一つは、実装に使われているPythonがCPythonではなくて、Pythonに色々と制約を加えたRPythonというものであるということです。
RPythonでは、すべての変数が型付けされます。
なので、RPythonで書かれたコードは静的な型付けコードに変換したうえでコンパイルすることができ、それで実行時のスピードが稼げているわけです。
だったら最初からRPythonで書いちゃえばいいじゃん、と思うのですが、実際に使った人によると、さすがにこれはこれで「使いにくい」のだそうです。
RPythonで、もっと使いやすい言語のインタプリタでも書いた方がいいっていうわけで、実際にPythonのインタプリタを書いてしまったのが、PyPyですね。
ちなみに、Rubyを実装したTopaz や、PHPを実装した、HippyVMなんてのも存在します。
で、最近のインタプリタ言語はインタプリタといいながら、JITコンパイラ搭載が当たり前、になってきています。
PyPyも然りです。
以上がどうもPyPyが速い理由なのだそうですが、じゃあ、だったらどうして、CPythonをやめて、全部PyPyにしてしまわないのか、今度はそちらが疑問に思えてきます。
また、落ち着いて考えると、PyPyと同等のJITをCPythonに実装してしまえば、実効速度が変わらない気もします。
だって、インタプリタ+JITをRPythonで書くのか、Cで書くのかの違いでしかないはずなのですから。
いよいよ謎の深まるPyPyなのでした。
ついでながら、確かもっと別の高速なPythonの実装があったはずだよなと思って調べ直してしまいました。
Cythonというのも世の中には存在します。
CPythonとは違ってCythonです。
これもPythonに、静的型付けを取り込んだような言語で、そこそこ高速です。
よくよく調べると、PyPy(RPython)と同じく、PythonのJITコンパイラ、Psycoから派生したものだったのですね。
以上、自分のメモも兼ねて、Pythonの方言関係を一巡りしておきました。
この記事へのコメント