この記事では、Pythonのコードの実行時間を計測する方法を紹介します。
実行時間を測るには標準ライブラリであるtime
モジュールのtime()
関数を使って「終了時間 - 開始時間」で計算することができます。
プロファイルしたい場合は、以下の記事を参照してください。
プロファイラを使って任意の関数やスクリプトファイルをプロファイリングする方法
それでは、サンプルを交えて実行時間の測り方を見ていきましょう!
実行時間を計測するには、time
モジュールのtime()
関数を使って終了時間 - 開始時間
で求めます。time
モジュールは、標準ライブラリです。
import time
# 開始時間
start = time.time()
# 計測したい処理
# 実行時間 = 終了時間 - 開始時間
end = time.time() - s_time
time.time()関数とは?
エポック秒(協定世界時1970年1月1日午前0時ちょうどからの経過秒数)を返す関数。
では、実際に実行時間を測ってみましょう。time.sleep()
関数を使って任意の秒数だけ処理を一時停止させ、実行時間を測ってみます。
import time
# 開始時間
start = time.time()
# 計測したい処理
time.sleep(0.1) # 0.1秒処理を止める
# 終了時間 - 開始時間でかかった時間を計測
end = time.time() - start
print(f'{end}秒かかりました!')
実行結果
0.1051640510559082秒かかりました!
おおよそtime.sleep()
で止めていた秒数になりました。
小数点以下の桁が多くて鬱陶しい場合は、round()
関数で丸めるか書式を設定して出力する精度を指定しましょう!
time = 0.161834627214927486
print(round(time, 2))
print('{:.2f}'.format(time))
# 0.16
print(round(time, 3))
print('{:.3f}'.format(time))
# 0.162
print(round(time, 4))
print('{:.4f}'.format(time))
# 0.1618
time.time()
は正確な時間を提供するとは限りません。より正確な時間を知りたい場合はtime.perf_counter()
関数を使います。Python 3.3で追加。
import time
# 開始時間
start = time.perf_counter()
# 計測したい処理
time.sleep(0.1) # 0.1秒処理を止める
# 終了時間 - 開始時間でかかった時間を計測
end = time.perf_counter() - start
print(f'{end}秒かかりました!')
実行結果
0.10325506400000001秒かかりました!
結果をナノ秒で取得したい場合はtime.time_ns()
やtime.perf_counter_ns()
を使います。 Python 3.7で追加。
import time
# 開始時間
start = time.perf_counter_ns()
# 計測したい処理
time.sleep(0.1) # 0.1秒処理を止める
# 終了時間 - 開始時間でかかった時間を計測
end = time.perf_counter_ns() - start
print(f'{end} ns')
print(f'{end / 1000000000} s')
実行結果
103594264 ns
0.103594264 s
float
型による精度低下を避けることができます。
実行時間を測るたびに毎回同じような処理を記述するのはめんどくさい。なので、あらかじめ関数にまとめておくと楽チンです。
例えば、以下のように2つの関数にまとめておくことで実行時間を測りたい処理の前後で呼び出すだけで済みます。
import time
def start():
global start_time
start_time = time.perf_counter()
def end(tag="経過時間"):
if "start_time" in globals():
print("{}: {:.9f} [sec]".format(tag, time.perf_counter() - start_time))
else:
print("start関数が呼ばれていない")
# 実行時間を測る
start()
time.sleep(0.1)
end()
実行結果
経過時間: 0.104684830 [sec]
デコレーターを使って実行時間を測ることもできます。定義したデコレーターを関数に修飾してやるだけで実行時間を測れるので何度も計測したい場合こっちの方が楽です。
サンプル
以下のような感じで定義できます。後始末もデコレーターを消すだけでいいので楽。
import time
# 関数の実行時間を測るデコレータ
def func_speed(func):
def _wrapper(*args, **keywargs):
start_time = time.time()
result = func(*args, **keywargs)
print('time: {:.9f} [sec]'.format(time.time() - start_time))
return result
return _wrapper
@func_speed
def func():
time.sleep(0.1)
func()
実行結果
time: 0.102931976 [sec]
ただし、ブロック外のコードには使えません。
高階関数を定義して実行時間を測ることもできます。
import time
def func_speed(func, *args, **kw):
start_time = time.time()
result = func(*args, **kw)
print('time: {:.9f} [sec]'.format(time.time() - start_time))
return result
以下のように使うことができます。
def func(second):
time.sleep(second)
return 1
# 引数には関数オブジェクトとその関数に渡す引数を指定する
func_speed(func, 0.1)
やってることはデコレーターと全く変わらないですね。ただ、時間を測りたくない場合に関数の呼び出しを書き換えなければならないのでめんどい。
timeit
モジュールを使うことでも実行時間を計測できます。
以下のコードでは、abs()
関数を100万回実行した時間を計測しています。
返された秒数は、平均値ではなく合計値なので注意してください。
import timeit
print(timeit.timeit('abs(-1)', number=1000000))
実行結果
0.09136387300000001
標準ライブラリの実行時間も計測することができます。
import time
import timeit
print(timeit.timeit('time.sleep(0.1)', number=10))
実行結果
1.012838086
setup
引数を指定することで計測に使用する要素の値を指定することができます。
以下のコードでは、 char = "a"
、 s = "abcde"
を指定し、char in s
の速度を計測しています。
import timeit
print(timeit.timeit('char in s', number=10000, setup='char = "a"; s = "abcde"'))
実行結果
0.00046209800000000106
以下のように、setup
引数で計測したい関数をインポートすることで自作した関数の速度も測ることができます。
import timeit
import time
def func(second):
time.sleep(second)
return 1
print(timeit.timeit('func(0.2)', number=1, setup='from __main__ import func'))
実行結果
0.203728162
この記事では、Pythonで実行時間を測る方法を解説しました。
実行時間は終了時間 - 開始時間
で測ることができました。これは他の言語でも同じなので覚えておくと便利です。
それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ
View Comments