Personal tools

promise - バイトコードを書き換えてPythonのコードを高速化

by ats posted at 2010-01-05 23:42 last modified 2010-01-05 23:42

promiseはPythonの関数の実行速度を高速化するためのモジュール。

デコレータ関数を使って,関数のバイトコードを書き換えることによって関数の実行速度を高速化する。

実際どのくらい高速化されるのか試してみよう。Pythnonの標準モジュールdecimalの__new__()メソッドにpromiseを使い,使わなかったケースと実行速度を比較してみた。

def foo():
D = decimal_p.Decimal
D('3.14')
D((0, (3, 1, 4), -2))
D(314)
D(' 3.14 \\n')
上記のような簡単な関数を,それぞれ10万回呼び出してみた。約8%ほど高速化していることが分かる。
 promiseを使わないケース 
 @promise.constant(__builtins__)した場合 
約5.47秒
約5.03秒

promiseは,オブジェクトの参照時,Name Lookupを出来るだけしないようにパイとコードを書き換えることで関数の実行を高速化している。先ほどの例で使ったpromise.constant(__builtins__)では,デコレータとして利用することでPythonの組み込み(Builtin)名前空間にあるオブジェクトを直接参照するようにバイトコードを書き換える。Pythonには3つの名前空間があるが,通常関数内でオブジェクトを参照するとき,まず関数の名前空間から名前を探し,その後モジュール,組み込みと名前空間をさかのぼってゆく。つまり3回名前の探索(Name Lookup)を行うわけだ。promiseは,isinstance()のような組み込みオブジェクト(関数)をリファレンスとしてバイトコードに埋め込むことで,Name Lookupにかかる時間を削減する。

また,promise.pure()をデコレータとして関数に添えると,関数のバイトコードを関数呼び出しをしている部分に埋め込む。こうすることで,関数呼び出し(Pythonでは関数もオブジェクトなのでオブジェクト参照)に伴うName Lookupを無くし,関数呼び出しのオーバーヘッドを無くして高速化を図る。

自動的に行われる最適化と違い,promiseはデコレータとして関数に対して適用する必要があるので,使うのに頭を使う。また,副作用がまったくないわけではない。

しかし,実際に高速化の効果があるし,仕組みもシンプルで,メカニズムを分かって使えばリスクも低いはずだ。なかなか面白い高速化のアプローチかも知れない。

Category(s)
python
The URL to Trackback this entry is:
http://coreblog.org/ats/promise-the-python-module/tbping

Re:promise - バイトコードを書き換えてPythonのコードを高速化

Posted by ボストンバッグ at 2010-01-22 23:44
Add comment

You can add a comment by filling out the form below. Plain text formatting.

(Required)
(Required)
(Required)
(Required)
コメントスパム避けのための認証文字列です

Captcha Image

Pythonな求人
r = urlopen("http://www.webcore.co.jp/recruit")
About this blog
■Author
atsこと柴田淳です。この記事を読んでいただくと,技術者としての人となりを分かってもらえるかも。
Webcore株式会社 代表取締役
Plone上で動く,オープンソースのBlog Product - COREBlog2を使って運用しています。

最近書いた原稿
最終回 Python 3.0座談会(動画つき) 2009-07-16
Python 3.0 Hacks 第6回 Pythonicな文字列フォーマットforamat()メソッド 2009-03-30
言語としての一貫性を重視したPython 3の進化 2009-02-20
Python 3が後方互換性を捨てても求めたもの 2009-02-02
Python 3.0 Hacks : 第0回 Pythonの2008-2009 2009-01-01
 
最近書いた本,Mook
みんなのPython 改訂版
Python使いはもちろん,プログラミングの初心者から,他言語からの移行組までご好評いただいているPythonの定番入門書の第2版です。Python 3.0を含む最新の情報について加筆を行い,より読みやすいように構成を大幅に見直しました。第一版をお持ちの方にもお役立ていただける内容になっています。
みんなのPython Webアプリ編
Pythonの基礎から,Webアプリやフレームワークの仕組みまで,つまることなく一気に学べる書籍です。「みんなのPython」と一緒に読んでください:-)。
 

Powered by Plone, the Open Source Content Management System