Posted at

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行目に時間を計測したい関数の名前と,その関数の実行に掛かった時間が表示されます.


雑感

ロジックと関係ないけど,何か結果が見たい場合,デコレータが輝くと思います.

今回は,時間の計測というタスクでした.

何かのお役に立てばなと思います.