付録: 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 を導入しておき, 管理者ユーザで下記を行う。

  1. psyco-1.6-src.tar.gz をダウンロードし,展開し,そのディレクトリへ移動する。
    $ gzcat psyco-1.6-src.tar.gz | tar xf -
    $ cd psyco-1.6
    
  2. setup.py を使ってインストールする。
    $ python setup.py install
    

自動的に,適切なオプションで C コンパイラが起動されて共有ライブラリが構築され, 補助的な Python モジュールとともに Python の site-packages ディレクトリに psyco としてインストールされる。

Mac OS X で,OS 標準または www.python.org でバイナリ配布されている Python の site-packages ディレクトリは,デフォルトで admin グループに対してパーミッションがありますから,補助グループとして admin に属する 管理者ユーザは,sudo コマンドに頼ることなくインストールできます。

3. Psyco の適用

L2Lisp.py (ファイル閲覧用 HTML) の先頭部分に import psycopsyco.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 にある最も基本的な方法である。適用方法の工夫による,より高度な効率化の余地があると思われる。


本編へ戻る


Copyright (c) 2008 OKI Software Co., Ltd.