先日のPyCon Kyushu Kagoshima 2024で登壇したcProfileの資料の内容から抜粋しつつ、cProifleの使い方について少し書いてみます。
Pythonのプロファイルとは
- Pythonの実行に関する統計情報
- 関数がどれだけ呼ばれたか
- 実行時間どのぐらいかかったか
Pythonでは標準モジュールのcProfileを使うと、プロファイルを取得できます。
プロファイルを取得する対象のコード
read_file.py
:
import datetime import timeit DATA_FILE = "data.jsonl" def main(): """ファイルの行数をカウントするスクリプト""" print("start:", datetime.datetime.now()) result = 0 with open(DATA_FILE) as input_file: for line in input_file: result += 1 print(f"result: {result} lines") print("end:", datetime.datetime.now()) if __name__ == "__main__": # 速すぎるのでtimeitで10回実行 print(timeit.timeit(main, number=10))
プロファイルの取得
cProfileでプロファイルを取得します。
今回はスクリプト全体のプロファイルを取得するので、次のようにシェルから実行します。
$ python -m cProfile -o read_file.profile read_file.py
read_file.py
を実行後、 read_file.profile
にプロファイルデータが保存されます。
SnakeVizによる可視化
cProfileで取得したプロファイル情報は、標準モジュールのpstatsでテキストとして読むことができますが、SnakeVizを使うとウェブブラウザ上でグラフ表示、データのソートなどができて簡単なので、今回はこれを使ってみます。
SnakeVizのインストール
$ pip install snakeviz
依存がTornadoのみなので、OSの追加パッケージなどが不要でハマりどころが少ないのが良かったです。
SnakeVizの実行
$ snakeviz read_file.profile
SnakeVizの画面(Chrome)
実行すると、Tornadoによるウェブサーバーが起動し、可視化されたプロファイルをウェブブラウザで閲覧できます。
一覧表示のほうはカラムのクリックでソートされるので、眺めるのが手軽だなと思いました。