(最終更新月:2022年9月)
✔このような方へ向けて書かれた記事となります
「Pythonで時間計測ってどうやるの?」
「timeメソッドとperf_counterは何が違う?」
「コードの実例を見てみたい!」
✔当記事を通じてお伝えすること
- Pythonのtimeメソッドを使った時間計測方法
- Pythonのperf_counterメソッドを使った時間計測方法
- timeメソッドとperf_counterメソッドを比較
- 【decorator】処理計測のデコレータ実例
当記事では、単にPythonで時間計測方法をお伝えするだけでなく、簡単に自作できるアプリのコードを紹介しているので、ご自身の手で動かして試すことができます。
ぜひ最後までご覧ください。
Pythonのtimeメソッドで時間計測アプリを作る
timeメソッドを使って、時間計測が可能です。
以下の順で解説していきます。
- 実例コードの公開
- 時間計測部分の解説
- 実行結果
【timeメソッド】実例コードの公開
timeメソッドを使った時間計測アプリのコードはこちらです。
#!/usr/bin/env python
#coding: utf-8
import time
if __name__ == '__main__':
ignite = input("Enterでスタート → ")
start = time.time()
finish = input("Enterでストップ → ")
end = time.time()
delta = round(end - start, 2)
print(f"時間計測:{delta}秒")
【timeメソッド】時間計測部分の解説
時間計測の部分はこちらになります。
start = time.time()
finish = input("Enterでストップ → ")
end = time.time()
delta = round(end - start, 2)
timeメソッドで時間を取得し、差分をroundで四捨五入しています。
【timeメソッド】実行結果
実行方法は以下のとおり。(ファイル名を「python_timer.py」とします。
$ python python_timer.py
Enterでスタート →
Enterでストップ →
時間計測:2.29秒
Pythonのperf_counterメソッドで時間計測アプリを作る
perf_counterメソッドを使って、時間計測が可能です。
以下の順で解説していきます。
- 実例コードの公開
- 時間計測部分の解説
- 実行結果
timeメソッドよりもより正確だと言われているメソッドです。
【perf_counterメソッド】実例コードの公開
perf_counterメソッドを使ったアプリのコードはこちらです。
#!/usr/bin/env python
#coding: utf-8
import time
if __name__ == '__main__':
ignite = input("Enterでスタート → ")
start = time.perf_counter()
finish = input("Enterでストップ → ")
end = time.perf_counter()
delta = round(end - start, 2)
print(f"時間計測:{delta}秒")
【timeメソッド】時間計測部分の解説
時間計測部分はこちら。
start = time.perf_counter()
finish = input("Enterでストップ → ")
end = time.perf_counter()
delta = round(end - start, 2)
timeメソッドの箇所をperf_counterメソッドに変えただけです。
【timeメソッド】実行結果
実行方法は以下のとおり。(ファイル名を「python_perf_counter.py」とします。
$ python python_perf_counter.py
Enterでスタート →
Enterでストップ →
時間計測:4.34秒
問題なく動きますね。
【timeメソッド vs perf_counter】どっちの関数が精度高いの?
timeメソッドとperf_counterメソッドの両方をご紹介しましたが、違いはあるのでしょうか?
違いがないのなら、好きなものを使えば良いでしょう。
以下のとおり2通りで試しました。
- roundメソッド有り
- roundメソッド無し
それぞれ見ていきましょう。
roundメソッドではミリ秒にしても違いがわからない
以下の通り、2つのメソッドを同時に実行します。
#!/usr/bin/env python
#coding: utf-8
import time
if __name__ == '__main__':
ignite = input("Enterでスタート → ")
start = time.time()
perf_start = time.perf_counter()
finish = input("Enterでストップ → ")
end = time.time()
perf_end = time.perf_counter()
delta = round(end - start, 5)
perf_delta = round(perf_end - perf_start, 5)
print(f"時間計測(timeメソッド):{delta}秒")
print(f"時間計測(perf_counterメソッド):{perf_delta}秒")
検証スタート。
$ python comparison.py
Enterでスタート →
Enterでストップ →
時間計測(timeメソッド):4.23793秒
時間計測(perf_counterメソッド):4.23793秒
roundメソッドで四捨五入すると、違いがわかりません。
roundメソッド無しでは数秒でも違いがでる
roundメソッドをなくしてみます。
#!/usr/bin/env python
#coding: utf-8
import time
if __name__ == '__main__':
ignite = input("Enterでスタート → ")
start = time.time()
perf_start = time.perf_counter()
finish = input("Enterでストップ → ")
end = time.time()
perf_end = time.perf_counter()
# delta = round(end - start, 5) #roundをコメントアウト
# perf_delta = round(perf_end - perf_start, 5)#roundをコメントアウト
delta = end - start
perf_delta = perf_end - perf_start
print(f"時間計測(timeメソッド):{delta}秒")
print(f"時間計測(perf_counterメソッド):{perf_delta}秒")
検証スタート。
$ python comparison.py
Enterでスタート →
Enterでストップ →
時間計測(timeメソッド):6.968681335449219秒
時間計測(perf_counterメソッド):6.968680547000076秒
差があるのがわかります。
正確さを求めるなら、推奨されているperf_counterメソッドが良さそうですね。
【decorator】処理計測のデコレータ実例
デコレータを使えば、好きな関数の処理時間を計測できます。
以下の順で解説していきます。
- 実例コードの公開
- デコレータ箇所のコード解説
- 実行結果
処理時間計測デコレータのコード
こちらのコードには以下の3つが含まれています。
- デコレータのコード
- デコレータで計測したい関数のコード
- ファイル実行のためのコード
#!/usr/bin/env python
#coding: utf-8
import time
#1.デコレータ
def timer(func):
def wrapper(*args, **kwargs):
start = time.perf_counter()
print("処理中です...")
func(*args, **kwargs)
end = time.perf_counter()
print(f"かかった時間は約{round(end - start, 2)}秒です。")
return wrapper
#2.計測したい関数です。
@timer
def looper(num):
l = []
for i in range(num):
time.sleep(0.2)
l.append(i)
#3.ファイル実行
if __name__ == '__main__':
num_str = input("数字を入力してください → ")
try:
num = int(num_str)
if num > 100:
print("100以下の数値を入力してください。")
else:
looper(num)
except:
print("数字を入力してください。")
デコレータ箇所のコード解説
デコレータのコードは以下のとおり。
def timer(func):
def wrapper(*args, **kwargs):
start = time.perf_counter()
print("処理中です...")
func(*args, **kwargs)
end = time.perf_counter()
print(f"かかった時間は約{round(end - start, 2)}秒です。")
return wrapper
関数実行の前後で時間を取得し、差分を計算しています。
デコレータの実行結果
デコレータを実行しました。
$ python time_decorator.py
数字を入力してください → 15
処理中です...
かかった時間は約3.0秒です。
時間がきちんと計測されていますね。
まとめ:正確さを求めるならperf_counterメソッドがおすすめ
当記事の内容をまとめます。
- 時間の計測には、timeメソッドかperf_counterメソッドが使える
- perf_counterメソッドの方がより正確
- 時間計測はデコレータにも活用できる
Pythonで時間計測をする方法は当記事のとおり。
timeモジュールのtimeメソッドか、perf_counterメソッドを使いましょう。