Categories: Python

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

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

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

ゆうまる

独学でプログラミングを勉強しているおじさん。いろんな言語を勉強したが浅く広くなためあまり仕事につながらない。また忘れっぽいため自分のブログを備忘録としても使っている。産まれてこのかたずっとネコを飼ってる生粋のネコ派。最近お腹が出てきて筋トレに奮闘中!

View Comments

Recent Posts

【Dart】コンストラクタのデフォルト引数について

Dartのコンストラクタのデフォルト引数…

2週間 ago

【Unity】有料アセットを無料で手に入れる方法

この記事では、Unityの有料アセットを…

4か月 ago

【Python】任意の秒数だけ処理を一時停止する方法【sleep()関数】

この記事では、Pythonで任意の秒数だ…

1年 ago

【Python】Wordの文書の新規作成と読み書き

この記事では、Pythonを使ってWor…

1年 ago

【Python】メタクラスって結局なんなの?

この記事では、Pythonのメタクラスに…

1年 ago