Python
python3

Pythonで処理の時間を計測する冴えた方法

More than 1 year has passed since last update.

バージョン

Pythonは3.6.0をつかっています.
stop_watch.pyにて

print(f"{func.__name__}は{elapsed_time}秒かかりました")

という処理を用いていますが,この記法は3.6.0以上でないと動きません.
自身のバージョンに合わせて適宜書き換えてください.
なお,他の部分に関しては,未確認ですが,3xなら動くと思います.

関連記事

Pythonで時間をはかるには,基本的には,以下の記事の方法を用います.

【Python】処理にかかる時間を計測して表示
python > 処理時間計測 > time.time() - start_time
pythonでメソッドの処理時間を計測する関数

上記の方法でも,時間は計れます.
しかし,書きたいロジックと時間の計測が一緒になっています.

そこで,ロジックと時間の計測を完全に分離する冴えた方法があるので, 共有します.

時間を計測する処理

stop_watch.py
from functools import wraps
import time
def stop_watch(func) :
    @wraps(func)
    def wrapper(*args, **kargs) :
        start = time.time()
        result = func(*args,**kargs)
        elapsed_time =  time.time() - start
        print(f"{func.__name__}は{elapsed_time}秒かかりました")
        return result
    return wrapper

上記のコードが時間を計測する処理です.
このコードにはデコレータを用いています.
funcに実際の処理をstartに計測開始時間をelaspsed_timeに処理に掛かった時間を格納しています.
デコレータについて,詳しく知りたい方は,こちらの記事に詳しく書いてくださっています.
Pythonのデコレータを理解するための12Step

実際の使い方

test.py
from stop_watch import stop_watch

@stop_watch
def func() :
    j=0
    for i in range(99999999) :
        j+=i
    print(j)

func()

実際の使い方は,このようにします.
時間を計測したい関数の上に,@stop_watchと書いて上げるだけです.
(*なお,同一ディレクトリ(フォルダ)に上記のstop_watch.pyと以下のtest.pyがあるという前提です.違う場合は,適宜インポート処理を書き換えてください)

結果は,

result
4999999850000001
funcは6.330682277679443秒かかりました

のように表示されます.
1行目に時間を計測したい関数の結果が表示されます.
2行目に時間を計測したい関数の名前と,その関数の実行に掛かった時間が表示されます.

雑感

ロジックと関係ないけど,何か結果が見たい場合,デコレータが輝くと思います.
今回は,時間の計測というタスクでした.
何かのお役に立てばなと思います.