読者です 読者をやめる 読者になる 読者になる

pypyでexeを作る

環境はbashとpython2.7とVisualStudio2008で試しました。

まずはpypyの最新ソースを取ってくる

$ git svn -r HEAD http://codespeak.net/svn/pypy/trunk pypy-trunk

もしくは

$ svn co http://codespeak.net/svn/pypy/trunk pypy-trunk

適当な.pyを書く

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import sys

def fibo(n):
    if n < 1: return 0
    return (fibo(n - 2) + fibo(n - 1)) if n > 2 else 1

def main(args):
    print fibo(int(args[1]))
    return 0

def target(*args):
    return main, None

if __name__ == '__main__':
    main(sys.argv)

pypyビルド!

$ python pypy-trunk/pypy/translator/goal/translate.py --batch --backend=c --output=fibo-c.exe fibo.py
... もりもりビルドログ ...
[Timer] compile_c              ---  2.8 s
[Timer] =================================
[Timer] Total:                 --- 21.8 s

何やらerrorの文字が踊っているがよくわからないので今は気にしないことにする。

実行!

$ time python fibo.py 38
39088169

real 0m18.084s
user 0m0.015s
sys  0m0.015s

$ time ./fibo-c 38
39088169

real 0m1.328s
user 0m0.015s
sys  0m0.000s

感想

  • 速いな〜。
  • svnのログ見てたら1.4.xのコミットがあったからそろそろ次回リリースがあるのかも。
  • 英語が赤点な人なのでドキュメントちゃんと読んでませんが、targetって関数作ってエントリポイントになる関数を返さないといけないみたい。そこがわからなくてコンパイルに手間取りました。
  • cliバックエンドも試したけど、コンパイルはできたもの実行時エラーになってしまった。jitのエラー?