Help us understand the problem. What is going on with this article?

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

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

雑感

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした