実行時間を計測する方法【Python】

時間計測の記事のアイキャッチPython

よく見るのは time.time() を使った方法だと思うので、精度などこだわりがなければこの方法で問題はないと思います。

time.time()

time.time() を使うと1970年1月1日0時0分0秒からの秒数であるUnix時間というものを取得できます。
プログラムの実行前と実行後でUnix時間を取得し、差を見ることで実行にかかった秒数を得ることができるのです。

import time

start_time = time.time()
time.sleep(3)
end_time = time.time()

print(end_time - start_time)
# 3.0032896995544434

秒数を 分と秒 に変換するには以下のような関数を作ってやればOKです。

def sec_to_min_sec(t):
  min = int(t / 60)
  sec = int(t - min*60)
  return min, sec
  
start_time = time.time()
time.sleep(140)
end_time = time.time()

min, sec = sec_to_min_sec(end_time - start_time)
print(f'min:{min} sec:{sec}')
# min:2 sec:20
time --- 時刻データへのアクセスと変換
このモジュールでは、時刻に関するさまざまな関数を提供します。関連した機能について、 datetime, calendar モジュールも参照してください。 このモジュールは常に利用可能ですが、すべての関数がすべてのプラットフォームで利用可能なわけではありません。このモジュールで定義されているほとんどの関数は、プラットフォ...

time.process_time()

現在のプロセスのシステムCPU時間とユーザーCPU時間の合計値を(小数秒単位で)返します。スリープ中の経過時間は含まれません。定義上、プロセス全体の時間です。返された値の基準点は未定義であり、2回の呼び出しの結果の差のみが有効である。

https://docs.python.org/ja/3/library/time.html#time.process_time
import time

def fibonacci(x):
  if x==1 or x==2:
    return 1
  else:
    return fibonacci(x-1) + fibonacci(x-2)

start_time = time.process_time()
fibonacci(35)
end_time = time.process_time()
print(end_time - start_time)
# 2.9565654310000014

sleepは計測に含まれません。

start_time = time.process_time()
time.sleep(3)
end_time = time.process_time()
print(end_time - start_time)
# 0.013808198999999632

time.perf_counter()

パフォーマンスカウンタの値(分数秒)を返します。パフォーマンスカウンタとは、短い時間を測定するために利用可能な最高の解像度を持つクロックのことです。この値にはスリープ中の経過時間が含まれ、システム全体に適用されます。返される値の基準点は未定義で、2回の呼び出しの結果の差だけが有効となります。

https://docs.python.org/ja/3/library/time.html#time.perf_counter
import time

start_time = time.perf_counter()
time.sleep(3)
end_time = time.perf_counter()
print(end_time - start_time)
# 3.003301611000097

time process_time perf_counter の違い

この記事を書く際に色々調べたけど、違いがよくわからなかったので少しまとめてみました。
間違えていたら教えてください。

関数絶対 or 相対time.sleepも計測
time絶対
process_time相対×
perf_counter相対

特に精度などのこだわりがなければ time.time() で問題ないと思います。

Understanding time.perf_counter() and time.process_time()
I have some questions about the new functions time.perf_counter() and time.process_time(). For the former, from the documentation: Return the value (in fraction...

Jupyter Notebookで時間計測 (Jupyterならこれが便利)

Jupyter Notebookで時間計測するにはマジックコマンドが使えます。
ここでは簡単に使い方を紹介するだけにしておきますが、もっと詳しく知りたい方はこちらの記事をご覧ください。

セルの実行時間を計測

セルの実行時間を計測したいならセルの最初に %%time を書けばOK
セルの最初に書かないとエラーが出るので注意

%%time

import time

time.sleep(1)
time.sleep(2)
time.sleep(3)
# CPU times: user 20.6 ms, sys: 3.03 ms, total: 23.6 ms
# Wall time: 6 s

1行のコードだけ実行時間を計測

セルのコード全てではなく、ある1行だけ計測したい時にわざわざセルを分けるのも面倒なので、そういう時は %time を使いましょう。
以下のようにして使います。

%time 計測対象コード
def fibonacci(x):
  if x==1 or x==2:
    return 1
  else:
    return fibonacci(x-1) + fibonacci(x-2)

%time fibonacci(35)
# CPU times: user 2.99 s, sys: 3 ms, total: 2.99 s
# Wall time: 3.01 s

コメント