付録: Psyco コンパイラによる L2Lisp.py の高速化
2008.6.3 (鈴)1. はじめに
Pysco とは,A. Rigo 氏が http://psyco.sourceforge.net/ で公開している一種の just-in-time コンパイラであり,Python プログラムを透過的に高速化する。 OS を問わず Intel 386 互換の CPU で利用できる。 ここでは Psyco の L2Lisp.py への適用を報告する。
2. Psyco の導入
Pysco のコンパイル済みバイナリは Linux 用と Win32 用だけが公開されている。 しかし,Windows 上の Cygwin や,Intel Mac 上の Mac OS X でソースから構築し,導入することは易しい。 あらかじめ,Cygwin ならば gcc,Intel Mac ならば Xcode を導入しておき, 管理者ユーザで下記を行う。
- psyco-1.6-src.tar.gz をダウンロードし,展開し,そのディレクトリへ移動する。
$ gzcat psyco-1.6-src.tar.gz | tar xf - $ cd psyco-1.6
- setup.py を使ってインストールする。
$ python setup.py install
自動的に,適切なオプションで C コンパイラが起動されて共有ライブラリが構築され, 補助的な Python モジュールとともに Python の site-packages ディレクトリに psyco としてインストールされる。
sudo コマンドに頼ることなくインストールできます。
3. Psyco の適用
L2Lisp.py (ファイル,
閲覧用 HTML)
の先頭部分に
import psyco と psyco.full() を次のように追加する。
$ diff -c L2Lisp.py~ L2Lisp.py *** L2Lisp.py~ 2008-05-30 16:28:46.000000000 +0900 --- L2Lisp.py 2008-06-03 08:01:19.000000000 +0900 *************** *** 117,122 **** --- 117,125 ---- __version__ = 7.1 + import psyco + psyco.full() + import operator, re, sys, threading try:
4. Psyco の効果
Psyco は透過的であり,適用後の L2Lisp.py の使い方は適用前と同じである。
しかし,
本編 §4と同じように
(tak 18 12 6) と (length (nqueens 8))
にかかる時間を測ると,
約 3 倍に高速化されていることが分かる。
MacBook Pro 15" (Mac OS X 10.4.11, Core Duo 2GHz, 1GB) の Python 2.5.2 では
(tak 18 12 6) が約 7.6 秒から約 2.7 秒に,
(length (nqueens 8)) が約 20.1 秒から約 7.4 秒に短縮された。
別の MacBook Pro 15" (Mac OS X 10.5.3, Core 2 Duo 2.5GHz, 4GB) の Python 2.5.1 (OS 標準) では
(tak 18 12 6) が約 6.4 秒から約 2.1 秒に,
(length (nqueens 8)) が約 16.9 秒から約 5.9 秒に短縮された。
5. おわりに
今回の結果は Python を支える層の高さとそれによる Python の有用性を十分に印象づける。 今回とった Psyco の適用方法は, Psyco 1.6 のソースに添付されている README.txt にある最も基本的な方法である。適用方法の工夫による,より高度な効率化の余地があると思われる。


