PyPyを試してみた

PyPyというPythonの処理系があるそうな。これが速いらしいので、どんなものか試してみた。

インストールはPyPyのホームページからバイナリをダウンロードしてくるだけです。
[追記]Ubuntuだとapt-getで取れました。

試すのは毎度おなじみのたらい回し関数(竹内関数)です。

def tarai(x, y, z):
    return tarai(tarai(x-1, y, z), tarai(y-1, z, x), tarai(z-1, x, y)) if x > y else y

if __name__ == '__main__':
    from sys import argv
    x, y, z = map(lambda arg: int(arg), argv[1:])
    print tarai(x, y, z)

普通のPython(CPython)の場合は、

ubuntu@ip-172-31-16-86:~/tarai/python$ time python tarai.py 12 6 0
12

real    0m28.077s
user    0m27.942s
sys     0m0.128s

である。

PyPyの場合は、

ubuntu@ip-172-31-16-86:~/tarai/python$ time pypy tarai.py 12 6 0
12

real    0m1.109s
user    0m1.028s
sys     0m0.080s

なんと、27倍も高速ではないか!?これはすごい。

PyPyの何が面白いかって、PyPyはPythonで実装されているということだ。CコンパイラがCで書かれているみたいな、よくわからない話だ。

それでどうして速くなるのか非常に不思議だ。PyPyは特殊なJITコンパイラ技術を用いているみたいだ。

今、論文よんでいるところなので、その辺の仕組みは今後のネタとする。

参考

http://www.longsleeper.com/pypyadvent11