LoginSignup
11
9

More than 5 years have passed since last update.

Pythonで実行時間を計測する方法 その2

Last updated at Posted at 2014-03-21

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
11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9