Python コードのプロファイル

Fariba Laiq 2023年1月30日
  1. cProfile を使用して Python コードをプロファイリングする
  2. Python で SnakeViz を使用してプロファイル結果を視覚化する
Python コードのプロファイル

プロファイリングは、スクリプトの実行に必要な時間と実行頻度に関する統計を表示する手法です。これにより、コードのどの部分を最適化してプログラムを効率化する必要があるかを理解できます。

cProfile を使用して Python コードをプロファイリングする

cProfile は Python の組み込みモジュールであり、プログラムの実行時間を測定し、メソッドが呼び出される頻度も示します。Python コードのプロファイルを作成するには、コードまたはメソッド名を run() メソッド呼び出しの文字列引数として記述します。

プログラムの合計実行時間とともに、特定のメソッドの実行にかかる時間も表示されます。

次のコードでは、run() メソッド呼び出しで文字列として簡単な比較操作を記述しています。出力には、そのコードのすべての統計が表示されます。

サンプルコード:

import cProfile

cProfile.run("0 < 1")

出力:

3 function calls in 0.000 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 <string>:1(<module>)
        1    0.000    0.000    0.000    0.000 {built-in method builtins.exec}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

それでは、バックエンドで多くのメソッド呼び出しを行うのにかなりの時間がかかったコードを書いてみましょう。次のコードでは、リストに番号を追加するネストされたループを含むメソッドを作成しました。

その名前を run() メソッドに渡して、このメソッドのプロファイルを作成します。出力には、このコードに関するすべての統計が表示されます。

サンプルコード:

import cProfile


def func():
    num = []
    for i in range(1, 100):
        for j in range(1, 100):
            num.append(j)


cProfile.run("func()")

出力:

9805 function calls in 0.009 seconds

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.006    0.006    0.009    0.009 <ipython-input-3-d9419f0448d8>:2(func)
        1    0.000    0.000    0.009    0.009 <string>:1(<module>)
        1    0.000    0.000    0.009    0.009 {built-in method builtins.exec}
     9801    0.003    0.000    0.003    0.000 {method 'append' of 'list' objects}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

Python で SnakeViz を使用してプロファイル結果を視覚化する

SnakeViz は、視覚化をプロファイリングするための Web ベースのツールです。インストールと使用が簡単にできます。

pip install snakeviz

次のコードの結果をプロファイリングして視覚化するとします。Python の環境では、コードを py ファイルに保存する必要があります。

3つの関数があり、それぞれに 1000 回実行され、いくつかの算術演算を実行するループが含まれています。

サンプルコード:

def func():
    a = 1
    b = 2
    for i in range(1, 1000):
        a += b


def func2():
    a = 1
    b = 2
    for i in range(1, 1000):
        a -= b


def func3():
    a = 1
    b = 2
    for i in range(1, 1000):
        a *= b


func()
func2()
func3()

次のコマンドを使用して、結果のプロファイルと視覚化を行います。

python -m cProfile -o temp.dat My_Script.py
snakeviz temp.dat

出力:

SnakeViz つらら

SnakeViz サンバースト

Icicle(デフォルト)と Sunburst は、SnakeViz が提供する 2つの視覚化モードです。つららの場合、長方形の幅は関数で費やされた時間を表します。

アークの角度範囲は、サンバーストに切り替えた場合の実行時間を表します。Style オプションを使用して、2つのスタイルを変更できます。

著者: Fariba Laiq
Fariba Laiq avatar Fariba Laiq avatar

I am Fariba Laiq from Pakistan. An android app developer, technical content writer, and coding instructor. Writing has always been one of my passions. I love to learn, implement and convey my knowledge to others.

LinkedIn

関連記事 - Python Profile