Pythonでデコレータを使って関数の実行時間を計測してみる

Python3で関数の処理時間を計測するデコレータを作成

デコレータ(decorator)とは、別の関数に付加機能をつける(装飾する)ものです。

計測したい関数の直前に@デコレータ名を記述すれば、その関数にデコレータが適用されます。
が、デコレータの定義関数の中では関数オブジェクトを返すようにしないといけません。
ここが重要です。

例えば、以下のスクリプトが記載されたファイルを実行してみます。


def decoraotr_test(func):
    def wrapper(*args, **kwsrgs):
        print('あなたが実行した関数は', func.__name__, 'ですね?')
    return wrapper

@decoraotr_test
def test_deco():
    pass

test_deco()

以下のように返ってきます。


$ python3 decorator_test.py
あなたが実行した関数は test_deco ですね?

関数の処理時間を計測するデコレータ関数のスクリプトの全体感


'''関数の処理時間を計測するデコレータを作成'''
import time

def logging_time(func):
    '''関数の処理の時間を計測するデコレータ用関数'''
    def wrapper(*args, **kwargs):
        # 前処理
        import datetime
        start = datetime.datetime.today()
        print('____関数名:', func.__name__, '___')
        # 関数の実行
        result = func(*args, **kwargs)
        # 後処理
        end = datetime.datetime.today()
        delta = end - start
        print('____', delta, '秒 ___')
        return result
    return wrapper

@logging_time
def go_to_bed(sec):
    '''引数の秒数分スリープする関数'''
    print('1秒だけスリープ')
    time.sleep(sec)

# 関数の実行
go_to_bed(1)

上記の内容が書かれたファイルをターミナルやコマンドプロンプトで実行します。


$ python3 decorator_test.py

____関数名: go_to_bed ___
1秒だけスリープ
____ 0:00:01.000997 秒 ___

こんな感じで表示されれば成功です!

まとめ

デコレータを使えば、既存の別の関数に手を加えることなく、手軽に関数の前後に新しい機能を追加することが出来ます。