Pythonコードの実行に時間がかかるときに、コード全体ではなくコード内のどの箇所で時間がかかっているか確認したいときがある。Pythonモジュールのline_profilerを使うと、1行単位で実行速度を計測できる。今回はline_profilerで関数内のコード1行ごとの実行時間を計測してみる。
Windows10(1903)のWSL(Ubuntu 18.04)とJupyter Notebookを使用。
line_profilerはバージョン2.1.2の時点ではpipでインストールできないらしいので、gitでクローンしてインストールする。
テスト用の関数を定義して、その実行速度を計測してみる。
以下のように行単位の実行時間が出力される。
出力結果の項目は以下の通り。
Jupyter Notebookではもっと簡単に計測できる。
先のLineProfilerインスタンスを作成したコードと同様の結果が得られる。
環境
Windows10(1903)のWSL(Ubuntu 18.04)とJupyter Notebookを使用。
line_profilerのインストール
line_profilerはバージョン2.1.2の時点ではpipでインストールできないらしいので、gitでクローンしてインストールする。
line_profilerでコードの実行速度を計測する
テスト用の関数を定義して、その実行速度を計測してみる。
import numpy as np from line_profiler import LineProfiler def test(loop): arr1 = np.random.rand(500,500,500) for i in range(loop): arr2 = np.random.rand(500,500,500) arr3 = np.random.rand(500,500,500) return 0 # インスタンス作成 lp = LineProfiler() # 計測する関数を追加 lp.add_function(test) # 計測する関数の実行 # 2は関数の引数、resultは返値 result = lp.runcall(test, 2) print('result =', result) # 計測結果の出力(単位をミリ秒に指定) lp.print_stats(output_unit=1e-3)
以下のように行単位の実行時間が出力される。
出力結果の項目は以下の通り。
- Line: ファイル内の行数
- Hits: 実行回数
- Time: 実行回数分の合計時間
- Per Hit: 平均(1回分の)実行時間
- % Time: 関数内での実行時間の割合
- Line Contents: コード
Jupyter Notebookでの時間計測
Jupyter Notebookではもっと簡単に計測できる。
%load_ext line_profiler import numpy as np def test(loop): arr1 = np.random.rand(500,500,500) for i in range(loop): arr2 = np.random.rand(500,500,500) arr3 = np.random.rand(500,500,500) return 0 # 計測の実行 # オプションuで出力する時間の単位を指定し、fで計測する関数を指定 %lprun -u 1e-3 -f test result = test(2) print('result =', result)
先のLineProfilerインスタンスを作成したコードと同様の結果が得られる。
0 件のコメント:
コメントを投稿