前回に続き、
本カンファレンスに一緒に参加した池さん
PyPy(執筆:池さん)
PyPy IN PRODUCTION
PyPyのセッションは、
- Armin Rigo氏
- 大学にてプログラミング言語および言語実装を研究。PyPyプロジェクトのリーダー。CPythonのJITコンパイラであるPsycoの作者。Antonio Cuni氏らとPyPyに関する論文を共著。
- Antonio Cuni氏
- 2006年よりPyPyのメインコミッター。CLI/
.NET、 JITコンパイラの開発者。PyPyの開発・ 研究により2010年にPhDを取得。pdb++の作者/マネージャ、 virtualenvのコントリビュータ。現在はOpenEndに雇われておりPyPyのフルタイム開発者。

PyPyって何?
最初にPyPyについて紹介します。
PyPyプロジェクトは2003年にスタートし、
PyPyには大きく2つの使命があります。
1つ目は動的言語を作成するためのフレームワークとしてのPyPyです。
これは言語仕様と実装を明確に分離し、
2つ目は、
これはRPython Toolchainを使って、
これらの2つから、
また、
- メモリとスレッドモデル
- ガーベージコレクションの戦略
- 最適化の適用
- そもそもJITコンパイラを持っているかどうか
など、
PyPyはさらにその先の目標を設定しています。伝統的に言語処理系は、
PyPyはアプリケーションと各ターゲット環境間の基本的なマッピングを提供し、
PyPy 1.5
PyPy1.
また、
PyPyの今後
PyPyは大規模な並列処理のためにマイクロスレッドをサポートしたStacklessバージョンも別にあります。StacklessバージョンとJITコンパイラの統合が現在進行中です。
cpyextはCPythonのC-API互換性レイヤーです。現状cpyextはどんな場面でもちゃんと動くというわけではありませんが、
メモリ消費が少ないコンパクトなインスタンス
処理速度
次のグラフは、

次のグラフは、

次のグラフは、

処理速度に関しての最新の情報はpypy.
PyPy活用事例
PyPyが実際に使われている事例を紹介します。
1つ目の事例は、
gitdmはCPythonでは63秒かかるのに対して、
2つ目の事例は、
3つ目の事例は、

他にも様々な場面でPyPyが活用されていますが、
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 HANDS-ON PyPyを実行するには、
次のように簡単に実行できます。 $ pypy program.py
ここでCPythonより速い、
簡単なコードを実演します。次のcount. py は5の倍数と5の倍数ではない数字の個数をカウントするコードです。import sys import time def count_
mult_ (N): mult = 0 not_of_ 5 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_ (N) end = time.clock() print 'count: ', count print 'time:', end-start, 'secs' if __of_ 5 name__ == '__main__' : main()PyPyで実行してみます。
$ /path/to/pypy-1.
5 /bin/pypy count.py 10000000 count: (2000000, 8000000) time: 0.17 secsPython2.
7で実行してみます。 $ python2.7 count.py 10000000 count: (2000000, 8000000) time: 1.
67 secsPython2.
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バイトコード命令が表示されます。 jitviewer Pythonバイトコード命令の詳細は、
Python公式ドキュメントのPython Bytecode Instructionsを確認下さい。
- PyPyのバグフィックス
PyPy HANDS-ONセッションではPyPyのバグフィックスのハンズオンがありました。
実際のバグの事例は次の通りです。
- html_
fibo. py (フィボナッチ数を計算しHTMLを生成するプログラム) - このプログラムをCPythonで実行します
- このプログラムをPyPyで実行します
- 結果はCPythonとPyPyの挙動が異なり、
PyPyのバグフィックスをします!
実際にCPythonでhtml_
fibo. を実行してみましょう。py $ python html_fibo.py <ul> <li>1</li> <li>1</li> <li>2</li> <li>3</li> <li>5</li> <li>8</li> <li>13</li> <li>21</li> <li>34</li> <li>55</li> <li>89</li> <li>144</li> </ul>
PyPyでhtml_
fibo. を実行すると、py 何も表示されません。参加者は、 講師とともにこのバグフィックスに挑戦しましたが、 結果的には誰もバグフィックスに至りませんでした。 - html_
Part2:PyPyを使用して独自のインタプリタを書く
PyPyはPythonインタプリタであるだけではなく、
しかし時間の都合上、
現状、
もしあなたがRPython Toolchainを使って、
以上でPyPy HANDS-ONは終わりです。
本講演の資料と動画はPYPY HANDS-ONで公開されています。
SPRINTS
筆者はSPRINTSではDjango REST Frameworkに出る予定でした。しかし、
PyPyのSPRINTSでは、
- PyPyメインコミッター同士で今後について打ち合わせ
- List of issuesのバグフィックス
(FreeBSDでのコンパイル失敗の原因調査、 PyPyでのctypesのバグトレース) - はじめてPyPyの開発に参加するエンジニアが、
シニアエンジニアからレクチャーを受ける
筆者は、
- 言語処理系の知識
(言語処理系全般の基礎知識や、 JITコンパイラについて) を有していないため、 言語処理系の理解を深める - 英語が苦手であり、
SPRINTSでいきなり会話するのは厳しい。そして、 ドキュメント翻訳は英語に慣れる素晴らしい環境 (英語重要) - 日本語翻訳ドキュメントがなく、
日本人エンジニアには敷居が高いので敷居を下げる (英語超重要)
最大の理由は、
また、
- 日本で協力者を募りPyPyの開発者ドキュメントを日本語翻訳する。翻訳後はPyPyチームにIRCかe-mailで報告するよ!
- PyPy Status Blogの日本語翻訳ブログのPyPy Status Blog JAを立ち上げる
- 翻訳は、
Google Groupsにpypy-jaというメーリングリストを作ります! - (筆者個人として、
コード読んでコミッターになるべく頑張るね! そして、 また会いましょう!)
そして、
- 日本のPythonistaはあなた方を追いかけます!
宣言してしまったからには仕方ありませんね。ええっ。日本のPythonistaとして一丸となって一緒に頑張って行きましょう。
というわけで、
筆者は日本のPythonistaが翻訳に興味があるのを知っています。前回のPyCon mini JPの翻訳に関するPython界隈の翻訳プロジェクトにおいてQ.翻訳プロジェクトで協力者を募集していたら参加しますか?
もちろん翻訳ではなく、
少しでも興味が有る方は、
次回予告
以上、
さて次回は、