Pythonで実行時間を計測する方法 その2
実行時間を計測するためのデコレータ その1で使ったデコレータは実行時間を返していました。
デコレートする関数のもともとの値を返しつつ、実行時間を表示するには以下のようにする。
printで標準出力に出力していますが、loggingモジュールなどを使うのもいいと思います。
timeデコレータの再定義
def time(func):
"""
デバッグ用デコレータ
実効時間を表示するデコレータ
"""
import functools
import datetime
@functools.wraps(func)
def wrapper(*args, **kwargs):
start = datetime.datetime.today()
print '-------------------------------------------------------------'
print func
print '----------------------------------'
print 'start:', start
result = func(*args, **kwargs)
end = datetime.datetime.today()
print 'end:', end
print '----------------------------------'
print 'running:', end - start
print '-------------------------------------------------------------'
return result
return wrapper
timeデコレータの実行
実行時間を計測するためのデコレータ その1で使ったtestfunc1に対して、新しいデコレータを用いてみました。
>>> testfunc1(rangelist)
-------------------------------------------------------------
<function testfunc1 at 0x01c40590>
----------------------------------
start: 2014-03-21 23:21:01.947000
end: 2014-03-21 23:21:02.362000
----------------------------------
running: 0:00:00.415000
-------------------------------------------------------------
ちゃんと実行時間が表示されました。
何もしないデコレータ
デバッグしたくないときに、いちいち関数定義を書き換えに行くのが面倒なときは、何もしないデコレータでtimeデコレータを上書きすればよいです。
なお、使ってみればわかると思いますが、IPython等でtabによる引数の補完ができなくなります。せっかくfunctools.wapasを用いているのだからdocstringをちゃんと書けば、docstringはデコレータでラップした関数でも表示できます。
def time(func):
"""
何もしないデコレータ
"""
import functools
@functools.wraps(func)
def wrapper(*args, **kwargs):
return func(*args, **kwargs)
return wrapper