そうだ! EuroPython 2011へ行こう

#3PyPyについての講演、ハンズオン、スプリント

前回に続き、Pythonそのものの講演について紹介したいと思います。今回は、PyPyというPythonで実装されたPythonの講演を紹介します。

本カンファレンスに一緒に参加した池さん@rokujyouhitomaPyPyというプロジェクトにとても興味をもたれたという話を受け、以下のPyPyの講演のレポートは池さんに執筆していただきました。

PyPy(執筆:池さん)

PyPy IN PRODUCTION

PyPyのセッションは、メインコミッター、設計者であるAntonio Cuni氏とArmin Rigo氏が講演されました。

Armin Rigo
大学にてプログラミング言語および言語実装を研究。PyPyプロジェクトのリーダー。CPythonのJITコンパイラであるPsycoの作者。Antonio Cuni氏らとPyPyに関する論文を共著。
Antonio Cuni
2006年よりPyPyのメインコミッター。CLI/.NET、JITコンパイラの開発者。PyPyの開発・研究により2010年にPhDを取得。pdb++の作者/マネージャ、virtualenvのコントリビュータ。現在はOpenEndに雇われておりPyPyのフルタイム開発者。
左: Antonio Cuni氏 右:Armin Rigo氏
左: Antonio Cuni氏 右:Armin Rigo氏

PyPyって何?

最初にPyPyについて紹介します。

PyPyプロジェクトは2003年にスタートし、EUなどから支援を受けたOSSプロジェクトです。EUからは2004年12月から2007年3月の期間、資金援助を受けました。

PyPyには大きく2つの使命があります。

1つ目は動的言語を作成するためのフレームワークとしてのPyPyです。

これは言語仕様と実装を明確に分離し、動的言語の共通的な変換のためによりユーザの実装を助けるフレームワークです。PyPyチームではRPython Toolchainと呼んでいます。

2つ目は、Python実装としてのPyPyです。

これはRPython Toolchainを使って、Python言語準拠の実装を新しく先進的な高レベルの機能を盛り込み、低レベルな変換を行うことなく、柔軟かつ処理速度が高速な実装を目指しています。

これらの2つから、PyPyは動的言語の実装のためのJust-in-Timeコンパイラを自動生成することを実現しています。

また、歴史的にユーザーの管理範囲外であって、

  • メモリとスレッドモデル
  • ガーベージコレクションの戦略
  • 最適化の適用
  • そもそもJITコンパイラを持っているかどうか

など、動的言語実装時における実装決定へのミックス&マッチ手法を可能にします。

PyPyはさらにその先の目標を設定しています。伝統的に言語処理系は、C/POSIX、Java、C#ののようなターゲットプラットフォームの言語で書かれてきました。

PyPyはアプリケーションと各ターゲット環境間の基本的なマッピングを提供し、.NETフレームワークやJava仮想環境のように言語実装をサポートするための標準化することによって、より高いレベルの機能を提供することが可能になることを目指しています。

PyPy 1.5

PyPy1.5は2011年4月30日にリリースされました。1.5ではCPythonの2.6と2.7.1の標準ライブラリを含むすべての機能をサポートしました。PyPyはCPythonと互換性を持った実装処理系です。

また、CPython拡張モジュールのAPIも修正され、様々なライブラリが利用可能になりました。速度は平均して25%程度のパフォーマンスが改善されました。

PyPyの今後

PyPyは大規模な並列処理のためにマイクロスレッドをサポートしたStacklessバージョンも別にあります。StacklessバージョンとJITコンパイラの統合が現在進行中です。

cpyextはCPythonのC-API互換性レイヤーです。現状cpyextはどんな場面でもちゃんと動くというわけではありませんが、wxPython、PIL、cx_Oracle、mysqldb、pycairoなどでは問題なく動きます。さらなるサポート領域を広げるために開発が進行中です。

メモリ消費が少ないコンパクトなインスタンス(例えば__slots__など)を調査しており、将来使えるようになる予定です。

処理速度

次のグラフは、CPythonを1.00とした場合のPyPyの速度を表しています。Python処理系の実装としての速度は、ほとんどの処理においてCPythonより速いです。

PyPy VS CPython
PyPy VS CPython

次のグラフは、PyPyのコードがリポジトリにコミットされる度に、Djangoの実行速度が改善されているのを示しています。PyPyは頻繁にコミットが行われており、速度が日増しによくなっています。

昨年のPyPyによるDjangoの速度
昨年のPyPyによるDjangoの速度

次のグラフは、先程の表にCPython2.6.3を加え比較出来るようにしたものです。CPython2.6.3よりもDjangoの処理速度が速いのが読み取れます。

昨年のPyPy VS CPython
昨年のPyPy VS CPython

処理速度に関しての最新の情報はpypy.orgのSPEED CENTER Time normalized to cpython 2.6.2で公開されています。

PyPy活用事例

PyPyが実際に使われている事例を紹介します。

1つ目の事例は、LWNのgitdmです。gitdmはLinuxカーネルの開発者の動向を追うために、gitのログデータを読み込み開発者のつながり、雇用主の特定、パッチコードについてなどの情報をデータマイニングするツールです。

gitdmはCPythonでは63秒かかるのに対して、PyPyでは21秒と、より早い結果となりました。

2つ目の事例は、MyHDLです。MyHDLはPythonを使ったハードウェア記述するDSL言語と検証言語を提供しているライブラリです。MyHDLのサイトによれば、PyPyインタプリタを使用することによって、シミュレーションプログラムは6?12倍高速に実行されたとのことです。

3つ目の事例は、PyPyプロジェクト自体です。PyPyは巨大で複雑なアーキテクチャを持ったソフトウェアです。まさに、PyPyのロゴ通り、自分の尾を飲み込み蛇(Ouroboros、ウロボロス)ですね。

Ouroboros
Ouroboros

他にも様々な場面でPyPyが活用されていますが、次の事例は、是非ともみなさんが作って下さい!PyPyを使う価値があるかもしれません。

PyPy HANDS-ON:PyPyハンズオン

PyPy HANDS-ONセッションの内容は次の2つを予定していました。

  • Part1:アプリケーションをPyPyで動かす
  • Part2:PyPyを使用して独自のインタプリタを書く

しかし残念ながら、時間の都合上、Part2に達することはできませんでした。

PyPy HANDS-ON
PyPy HANDS-ON

PyPy環境の構築

Part1に入る前にPyPyの環境を作りましょう。

まずはPyPy1.5を用意します。PyPy.1.5のダウンロードはこちらです。

インストールに関するドキュメントはこちらです。

bitbucket.orgのPyPyリポジトリからpypyのパッケージを持ってきてください。

$ hg clone http://bitbucket.org/pypy/pypy
$ cd pypy
$ hg up -r release-1.5

次に、JITコンパイラのログファイルを解析を助けるツールjitviewerをインストールします。jitviewerは他のパッケージに依存しており、それらのパッケージをインストールするために、distributeをインストールすることを推奨します。

distributeのインストールは次の通りです。

$ curl -O http://python-distribute.org/distribute_setup.py
$ /path/to/pypy-1.5/bin/pypy distribute_setup.py

また、サードパーティーのライブラリをインストールしたいのであれば、pipをインストールすることをお勧めします。

$ curl -O https://github.com/pypa/pip/raw/master/contrib/get-pip.py
$ /path/to/pypy-1.5/bin/pypy get-pip.py

distributeがインストールされたら、jitviewerをインストールします。

$ hg clone http://bitbucket.org/pypy/jitviewer
$ cd jitviewer
$ /path/to/pypy-1.5/bin/pypy setup.py develop

Part1:アプリケーションをPyPyで動かす

Part1では、アプリケーションをPyPyで動かしたいユーザ向けに、次のような内容でした。

  • 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 HANDS-ON

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ファイルが生成されます。

jitviewerPyPyのJITコンパイラが生成するログファイルの分析ツールです。実際にjitviewerを起動してみます。

$ PYTHONPATH=/path/to/pypy/ /path/to/jitviewer.py log

jitviewerが起動したらhttp://localhost:5000/へウェブブラウザでアクセスします。リンクをクリックすると展開され、Pythonバイトコード命令が表示されます。

jitviewer
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を実行すると、何も表示されません。参加者は、講師とともにこのバグフィックスに挑戦しましたが、結果的には誰もバグフィックスに至りませんでした。

Part2:PyPyを使用して独自のインタプリタを書く

PyPyはPythonインタプリタであるだけではなく、動的言語を実装するためのライブラリRPython Toolchainを持っています。Part2では、独自のプログラミング言語を実装する人、JITコンパイラの内部動作を詳しく知りたい人向けのパートを予定していました。

しかし時間の都合上、実際には行われませんでした(筆者は心から落胆しましたが、内容がハード過ぎます。仕方ないですね⁠⁠。

現状、PyPyプロジェクトのサイトでRPython Toolchainを使った動的言語の実装が紹介されています。

もしあなたがRPython Toolchainを使って、独自の動的言語を作成したいのであれば、次の資料を参考するのがよいでしょう。

以上でPyPy HANDS-ONは終わりです。

本講演の資料と動画はPYPY HANDS-ONで公開されています。

SPRINTS

筆者はSPRINTSではDjango REST Frameworkに出る予定でした。しかし、あまりにPyPyの魅力に取りつかれてしまったために、PyPySPRINTSに急遽参加しました(Django REST Frameworkの皆さんごめんなさい。そしてPyPyの皆さん急にごめんなさい⁠⁠。

PyPySPRINTSでは、周りのエンジニアは次のことをしていました。

  • PyPyメインコミッター同士で今後について打ち合わせ
  • List of issuesのバグフィックス(FreeBSDでのコンパイル失敗の原因調査、PyPyでのctypesのバグトレース)
  • はじめてPyPyの開発に参加するエンジニアが、シニアエンジニアからレクチャーを受ける

筆者は、SPRINTSの前日から開発ドキュメントの翻訳を始めました。翻訳を始めた理由をあげます。

  • 言語処理系の知識(言語処理系全般の基礎知識や、JITコンパイラについて)を有していないため、言語処理系の理解を深める
  • 英語が苦手であり、SPRINTSでいきなり会話するのは厳しい。そして、ドキュメント翻訳は英語に慣れる素晴らしい環境(英語重要)
  • 日本語翻訳ドキュメントがなく、日本人エンジニアには敷居が高いので敷居を下げる(英語超重要)

最大の理由は、開発者ドキュメントが整備されており、読まずにいきなりコードを修正する自信が筆者にはありません。ゆくゆくはPyPyの実装に取り掛かりたいのが本音です。

また、隣の席に、メインコミッターのArmin Rigo氏がおられたので、急遽作った資料でプレゼンテーションを行い、次のことを宣言してきました。

  • 日本で協力者を募りPyPyの開発者ドキュメントを日本語翻訳する。翻訳後はPyPyチームにIRCかe-mailで報告するよ!
  • PyPy Status Blogの日本語翻訳ブログのPyPy Status Blog JAを立ち上げる
  • 翻訳は、Google Groupsにpypy-jaというメーリングリストを作ります!
  • (筆者個人として、コード読んでコミッターになるべく頑張るね!そして、また会いましょう!)

そして、最後に日本のPythonistaを代弁し次のことを伝えました。

  • 日本のPythonistaはあなた方を追いかけます!

宣言してしまったからには仕方ありませんね。ええっ。日本のPythonistaとして一丸となって一緒に頑張って行きましょう。

というわけで、筆者は、協力者を募集しています。翻訳は始まったばかりで入りやすいのではないでしょうか?筆者もわからない事だらけです。

筆者は日本のPythonistaが翻訳に興味があるのを知っています。前回のPyCon mini JPの翻訳に関するPython界隈の翻訳プロジェクトにおいてQ.翻訳プロジェクトで協力者を募集していたら参加しますか?という設問に、日本のPythonistaが11%の方が翻訳に参加する58%の方が興味のある技術なら参加するとアンケートに答えたことを決して忘れません。

もちろん翻訳ではなく、PyPyコミッターに今すぐなる方も大歓迎です!

少しでも興味が有る方は、筆者(@rokujyouhitoma)までお気軽にお声がけ下さい。

次回予告

以上、池さんのPyPyの講演等に関するレポートです。PyPyに興味をもった人がいましたら是非、池さんに声をかけてみてください。

さて次回は、アプリケーションに関する講演について紹介したいと思います。

おすすめ記事

記事・ニュース一覧