私は自分のコードをプロファイリングするためにcProfileを使用してきましたが、うまく機能しています。また、gprof2dot.pyを使用して結果を視覚化します(少しわかりやすくします)。
ただし、cProfile(およびこれまでに見た他のほとんどのPythonプロファイラー)は、関数呼び出しレベルでのみプロファイリングするようです。これは、特定の関数が異なる場所から呼び出されたときに混乱を引き起こします-コール#1またはコール#2が時間の大半を占めているかどうかはわかりません。問題の関数の深さが6レベルで、他の7つの場所から呼び出された場合、これはさらに悪化します。
行ごとのプロファイリングを取得するにはどうすればよいですか?
これの代わりに:
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)」呼び出しとは別に、その呼び出しで何が時間がかかっているかを確認できます。
それは理にかなっていますか?この種の情報を収集するプロファイリングライブラリはありますか?私が見逃した素晴らしいツールはありますか?
pstats.print_callers
。例はこちらです。