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
出力:
Icicle
(デフォルト)と Sunburst
は、SnakeViz が提供する 2つの視覚化モードです。つららの場合、長方形の幅は関数で費やされた時間を表します。
アークの角度範囲は、サンバーストに切り替えた場合の実行時間を表します。Style
オプションを使用して、2つのスタイルを変更できます。
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