PyPy HANDS-ON:PyPyハンズオン
PyPy HANDS-ONセッションの内容は次の2つを予定していました。
- Part1:アプリケーションをPyPyで動かす
- Part2:PyPyを使用して独自のインタプリタを書く
しかし残念ながら,
PyPy環境の構築
Part1に入る前にPyPyの環境を作りましょう。
まずはPyPy1.
インストールに関するドキュメントはこちらです。
bitbucket.
$ hg clone http://bitbucket.org/pypy/pypy
$ cd pypy
$ hg up -r release-1.5
次に,
distributeのインストールは次の通りです。
$ curl -O http://python-distribute.org/distribute_setup.py
$ /path/to/pypy-1.5/bin/pypy distribute_setup.py
また,
$ curl -O https://github.com/pypa/pip/raw/master/contrib/get-pip.py
$ /path/to/pypy-1.5/bin/pypy get-pip.py
distributeがインストールされたら,
$ hg clone http://bitbucket.org/pypy/jitviewer
$ cd jitviewer
$ /path/to/pypy-1.5/bin/pypy setup.py develop
Part1:アプリケーションをPyPyで動かす
Part1では,
- PyPy JITコンパイラの概要説明
- PyPyの試し方
- JITコンパイラにより生成されたトレースログを表示する方法
- PyPyのバグとバグフィックス
- Just-in-Timeコンパイラ
PyPyのJust-in-Time(JIT)コンパイラについての説明です。JITコンパイラはコード実行時に,
最適化されたマシンコードを自動生成するアーキテクチャです。 例えば,
ループの場合, 抽象構文木に変換後, 値の型, 条件分岐を記録し, 最適化されたバイトコードを生成します。しばしば条件分岐の記録が失敗しますが, その際は, 失敗した箇所から再度トレースを開始する仕組みになっています。 JITコンパイラはIntel x86,
amd64プロセッサをサポートしており, 直にARMをサポート予定です。またMozilaプロジェクトのTraceMonkeyによく似たアーキテクチャです。 PyPyのPythonインタプリタは高水準言語であるRPythonで書かれています。JITコンパイラジェネレーションを使い,
このRPythonのコードからJITコンパイラを自動生成しています。 - PyPyを試してみる
-
PyPyを実行するには,
次のように簡単に実行できます。 $ pypy program.py
ここでCPythonより速い,
簡単なコードを実演します。次のcount. pyは5の倍数と5の倍数ではない数字の個数をカウントするコードです。 import sys import time def count_
mult_ of_ 5(N): mult = 0 not_ mult = 0 for i in range(N): if i % 5 == 0: mult += 1 else: not_ mult += 1 return mult, not_ mult def main(): N = int(sys.argv[1]) start = time.clock() count = count_ mult_ of_ 5(N) end = time.clock() print 'count: ', count print 'time:', end-start, 'secs' if __ name__ == '__ main__': main() PyPyで実行してみます。
$ /path/to/pypy-1.
5/bin/pypy count.py 10000000 count: (2000000, 8000000) time: 0. 17 secs Python2.
7で実行してみます。 $ python2.7 count.py 10000000 count: (2000000, 8000000) time: 1.
67 secs Python2.
7よりもPyPyの処理速度が速い結果となりました。 次に,
JITコンパイラのログを取ってみましょう。JITコンパイラのログは次の通り, 環境変数PYPYLOGを設定する事によって出力できます。 $ PYPYLOG=jit:log /path/to/pypy-1.
5/bin/pypy count.py 10000000 その結果,
logファイルが生成されます。 jitviewerはPyPyのJITコンパイラが生成するログファイルの分析ツールです。実際にjitviewerを起動してみます。
$ PYTHONPATH=/path/to/pypy/ /path/to/jitviewer.py log
jitviewerが起動したらhttp://
localhost:5000/へウェブブラウザでアクセスします。リンクをクリックすると展開され, Pythonバイトコード命令が表示されます。 Pythonバイトコード命令の詳細は,
Python公式ドキュメントのPython Bytecode Instructionsを確認下さい。