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・・・)
ひとまず以上です。