私はコードのプロファイリングにcProfileを使用してきましたが、うまく機能しています。また、gprof2dot.pyを使用して結果を視覚化します(少し明確にします)。
ただし、cProfile(およびこれまでに見た他のほとんどのPythonプロファイラー)は、関数呼び出しレベルでのみプロファイリングするようです。これは、特定の関数が異なる場所から呼び出されるときに混乱を引き起こします-呼び出し#1または呼び出し#2が大部分の時間を占めているかどうかはわかりません。問題の関数が他の7つの場所から呼び出され、6レベルの深さである場合、これはさらに悪化します。
行ごとのプロファイリングを取得するにはどうすればよいですか?
これの代わりに:
function #12, total time: 2.0s
私はこのようなものを見たいです:
function #12 (called from somefile.py:102) 0.5s
function #12 (called from main.py:12) 1.5s
cProfileは、合計時間のどれだけが親に「転送」されるかを示しますが、多数のレイヤーと相互接続された呼び出しがある場合、この接続は失われます。
理想的には、データを解析し、各行に与えられた合計時間を含むソースファイルを表示するGUIが必要です。このようなもの:
main.py:
a = 1 # 0.0s
result = func(a) # 0.4s
c = 1000 # 0.0s
result = func(c) # 5.0s
次に、2番目の「func(c)」呼び出しをクリックして、「func(a)」呼び出しとは別に、その呼び出しで何が時間を取っているかを確認できます。それは理にかなっていますか?