マジックコマンドで実行時間を計測【Jupyter】

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

計測方法の解説

Jupyter Notebookで実行時間を計測するにはマジックコマンドを使う。
マジックコマンドには色々なものがあるが、%time, %%time, %timeit, %%timeitを使うことで時間計測ができる。

使い方を紹介する前に timetimeitの違い、 %%% の違いを説明する。

timeとtimeitの違い

timetimeit はどちらも実行時間を計測するためのマジックコマンドだけど若干動作が違う。

time一度だけ実行し時間計測をする。
timeit複数回実行し時間計測をする。平均と標準偏差を出してくれる。

プログラム中で実行時間を測りたいだけなら time でOK
timeitを使うと何回も実行されるので時間がかかる。

正確な実行時間が欲しければ timeit の方が良いかもしれない。

%と%%の違い

% がついているものは line modeで1行に対してマジックコマンドを適用し、
%% がついているものは cell mode でせるに対してマジックコマンドを適用する。

具体的にどのような動作をするかはドキュメントを見てほしいが、時間計測に関しては
%time が1行のプログラムの時間を計測し、
%%timeはセルの時間を計測することになる。

%timeit , %%timeit も同様。

実行時間を計測してみる

1行のプログラムだけを計測 ( %time or %timeit)

1行だけの時間を測る場合はこのように
%time 計測対象プログラム
or
%timeit 計測対象プログラム
として計測する。

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
%timeit fibonacci(35)
# 2.33 s ± 113 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# 1 loop, best of 5: 2.96 s per loop (Google colabで実行)

セルを計測 ( %%time or %%timeit)

セルの時間を測る場合はこのようにする。

%%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
%%timeit

import time

time.sleep(1)
time.sleep(2)
time.sleep(3)
# 6.01 s ± 3.97 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
# 1 loop, best of 5: 6.01 s per loop(Google colabで実行)

ちなみにこの時のマジックコマンドはセルの先頭に描く必要があるので注意!!

import time

%%time
# SyntaxError: invalid syntax

time.sleep(1)
time.sleep(2)
time.sleep(3)

お気づきの方もいるかもしれませんが、ローカルのJupyter Notebookで実行した時と Google Colabで実行した時で出力内容が違いました。謎なのでご存じの方がいれば教えていただきたいです。

%timeit , %%timeit の繰り返し回数の変更

%timeit%%timeitの繰り返し回数は

%%timeit -n3 -r3

import time

time.sleep(1)
time.sleep(2)
time.sleep(3)
# 6.01 s ± 789 µs per loop (mean ± std. dev. of 3 runs, 3 loops each)

のように -n-r を使うことで変更ができます。
timeitの繰り返しはまだ深く理解していないのでまた追記するかもしれません。

Built-in magic commands — IPython 7.29.0 documentation

コメント

タイトルとURLをコピーしました