Pythonの処理時間計測

プログラムの処理時間を測りたいなと思い、まずPythonの処理時間計測のためのモジュールをつくってみました。PHPのやつも作りましたが、後ほど。

プログラム mtime.py
#encoding=UTF-8
#プログラムの処理時間を計測するプログラム
import time;
class mtime:
        def __init__(self):
                self.start = time.time();
                print 'start...';
        def end(self):
                self.end = time.time();
                print "...stop!";
        def tprint(self):
                self.process = self.end - self.start;
                self.h = int(self.process / 3600);
                self.process -= self.h * 3600;
                self.m = int(self.process / 60);
                self.process -= self.m * 60;
                self.s = self.process;
                print "time: %dh %dm %fs" % (self.h, self.m, self.s);

プロセスは、オブジェクト生成時の時間と、endメソッドを実行したときの時間の差を取って、それを?h ?m ?sの形に整形して出力といったところ。

使用例

例えば、for文で100万回のループの処理時間を取得する。

>>> import mtime
>>> def foo():
...     t=mtime.mtime()
...     for i in range(0,1000000):
...             pass
...     t.end()
...     t.tprint()
...
>>> foo()
start...
...stop!
time: 0h 0m 0.069343s

インタプリタでやるとこんな書き方になってしまう。これだったらtimeitモジュールの機能を使った方がよさそうだ。だから、mtimeモジュールはプログラムをファイルに書いたときにこそ使えるものだろう。

コメント

情報科学においては、処理時間というのも重要な指標だと思います。また、同じような処理を行ったときの言語ごとの処理時間の比較等もできておもしろそうです。試しにPHPで100万回のループを行ったところ、約0.05秒でした。プログラミング言語が手段であるならば、適宜処理速度の速い言語を使うということも重要なことかと思います。

追記 xrange()を使用して

コメントを受けて、range()の代わりにxrange()を使用して全く同じことをやってみました。

>>> def foo():
...     t=mtime.mtime()
...     for i in xrange(0,1000000):
...             pass
...     t.end()
...     t.tprint()
...
>>> foo()
start...
...stop!
time: 0h 0m 0.019774s

全然スピードが違いますね(笑)
range(a,b)がaからbまでの数字のリストを作ることに対して、xrange(a,b)はxrangeというオブジェクトを生成しています。「だから速い」というのは少々強引ですが、少なくともrange(a,b)はaとbの差が大きいほどメモリが必要なのに対して、xrange(a,b)はどんなにaとbの差が大きくても同じメモリ量で済むという特性はあるようです。
ありがとうございました>id:methaneさん