PythonのcProfileモジュールを使ってプロファイル取得とSnakeVizによる可視化

先日のPyCon Kyushu Kagoshima 2024で登壇したcProfileの資料の内容から抜粋しつつ、cProifleの使い方について少し書いてみます。

tokibito.hatenablog.com

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を使うとウェブブラウザ上でグラフ表示、データのソートなどができて簡単なので、今回はこれを使ってみます。

jiffyclub.github.io

SnakeVizのインストール

$ pip install snakeviz

依存がTornadoのみなので、OSの追加パッケージなどが不要でハマりどころが少ないのが良かったです。

SnakeVizの実行

$ snakeviz read_file.profile

SnakeVizの画面(Chrome

実行すると、Tornadoによるウェブサーバーが起動し、可視化されたプロファイルをウェブブラウザで閲覧できます。

SnakeVizで可視化されたコールグラフ

pstatsと同様の呼び出し結果の一覧表示

一覧表示のほうはカラムのクリックでソートされるので、眺めるのが手軽だなと思いました。