LoginSignup
26
20

More than 5 years have passed since last update.

jupyterでコードのスピードを測定する

Posted at

pythonで計算が帰ってこない問題が発生するので
まずはスピードを測定するところからはじめようと思い
簡単に使えそうなのをまとめてみました

環境

・python 3系
・jupyter lab

測定対象

サンプル下記の関数にかかる時間を測定します

#1億個の数字を足す関数
def measurement_obj():
    result = 0
    for no in range(100000000):
        result += no

time関数

現在時刻を表示するtime関数を使って
かかった時間を算出シンプルな手法

import time#time関数を取得

start = time.time()#開始時刻
measurement_obj()#対象の関数
end = time.time()#終了時刻

print(end-start, '秒')#終了時刻-開始時刻でかかった時間
5.131968021392822 秒

なんだかんだつかいやすい

%time (*IPythonのみ)

IPythonには時間計測用の機能があって便利

#測定する関数と同じ行に「%time」を記入
%time measurement_obj()
CPU times: user 4.99 s, sys: 0 ns, total: 4.99 s
Wall time: 5 s

5秒

%timeit(IPythonのみ)

処理を自動的に何度か実行して時間を計測してくれる
これも便利

#これも測定する関数と同じ行に「%timeit」を記入
%timeit measurement_obj()
5.04 s ± 79.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

7回まわしてスピードを測定してくれました(5.04 s)
標準偏差(±79.5 ms)も出してくれて安心

%%time(*IPythonのみ)

%を2つにするとセル全体を測定してくれる

%%time #セルの一番上に「%%time」を記入する

#measurement_objを2つ実行する
measurement_obj()
measurement_obj()
CPU times: user 10.4 s, sys: 0 ns, total: 10.4 s
Wall time: 10.4 s

セル全体で10.4秒

%%timeit(*IPythonのみ)

timeitにの%%版もあります
先程と同様セル全体を測定し、さらに何回も試してくれる

%%timeit
measurement_obj()
measurement_obj()
10.4 s ± 189 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

1回10秒×7回実行するので結構時間がかかる(約70秒)
1分超えてくると最終的なチェックに使うくらいがちょうどいいかもしれない

line_profiler

行単位でかかった時間を計測できる便利な関数

※追加でインストールが必要(pipでOK)
下記のコードをコンソール上で実行

$ pip install line_profiler

実行

import line_profiler
pr = line_profiler.LineProfiler()#LineProfilerクラスのインスタンス生成
pr.add_function(measurement_obj)#対象の関数をadd_functionで登録
pr.runcall(measurement_obj)#runcallで実行
pr.print_stats()#結果を表示
Timer unit: 1e-06 s
Total time: 825.232 s
File: <ipython-input-2-9c5cb106b08c>
Function: measurement_obj at line 1

Line #      Hits         Time  Per Hit   % Time  Line Contents
==============================================================
     1                                           def measurement_obj():
     2         1         24.0     24.0      0.0      result = 0
     3 100000001  410152920.0      4.1     49.7      for no in range(100000000):
     4 100000000  415079200.0      4.2     50.3          result += no
項目 意味
Line ソースコードの行番号
Hits その行が実行された回数
Time その行の実行に費やした時間の合計、単位は先頭行の Timer unit で示されている
Per Hit その行を 1 回実行するのに費やした時間
% Time その行の実行に費やした時間の全体に対する割合
Line Contents 行番号に対応するソースコード

830秒となかなか時間がかかりました
「やはりループしているところが時間がかかっている」
みたいな事がわかる
(今回のサンプルくらいシンプルなのだとわかりやすいですが)

他にもいろいろあるみたいですが
(cprofile, memory_profiler, heapy, pref・・・)
ひとまず以上です。

26
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
26
20