102
93

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Posted at

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

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

102
93
4

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
102
93

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?