2013年2月5日火曜日

[Python] with文を使った実行時間計測クラス(コンテキストマネージャー)

時間計測にはtimeitとかもありますが、もっとお気楽に測る場合の話です。
Matlab - tic, toc functions analog in Python
ここで紹介されていたやり方です。with文では、withの後ろに与えたコンテキストマネージャクラスがステートメント内に入るときに__enter__が呼ばれ(本来asで受け取る変数を返す)、終わりに__exit__が呼ばれます。これを利用して__enter__で時間計測開始を、__exit__で時間計測結果の出力を行い、with文のステートメントの中のプログラムの実行時間を表示します。with文の詳細については「python with文」でぐぐってください。
# context_timer.py
import time
import sys

class Timer(object):
    def __init__(self, name=None, out=sys.stdout):
        self.name = name
        self.out = out

    def __enter__(self):
        self.tstart = time.time()

    def __exit__(self, type, value, traceback):
        if self.name:
            print >> self.out, '[%s]' % self.name,
        print >> self.out, 'Elapsed: %s' % (time.time() - self.tstart)
これを使って、1から1000までの整数の和を計算する時間を測る場合は次のようにwith文を使います。
from context_timer import Timer
with Timer("Sum"):
    val = 0
    for i in xrange(1, 1001):
        val += i
    print val
出力は次のようになります。
500500
[Sum] Elapsed: 0.00104784965515

0 件のコメント:

コメントを投稿