Python PR

【Python】任意の処理の実行時間を測る方法

記事内に商品プロモーションを含む場合があります

この記事では、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で追加。

ナノ秒は10億分の1秒で記号はns。
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モジュールで実行時間を測る

timeitモジュールを使うことでも実行時間を計測できます。

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で実行時間を測る方法を解説しました。

実行時間は終了時間 - 開始時間で測ることができました。これは他の言語でも同じなので覚えておくと便利です。

それでは今回の内容はここまでです。ではまたどこかで〜( ・∀・)ノ