web-dev-qa-db-ja.com

Pythonプロファイラーを使用してコールツリーを取得するにはどうすればよいですか?

以前は、SystemMonitorアプリケーションに組み込まれているNice Appleプロファイラーを使用していました。C++コードがデバッグ情報を使用してコンパイルされている限り、実行中のアプリケーションをサンプリングして、親関数の時間の何パーセントがこの関数(および本体と他の関数呼び出し)に費やされたかを示すインデントされたツリー。

たとえば、mainがfunction_1およびfunction_2を呼び出した場合、function_2function_3を呼び出し、次にmainがfunction_3を呼び出します。

main (100%, 1% in function body):
    function_1 (9%, 9% in function body):
    function_2 (90%, 85% in function body):
        function_3 (100%, 100% in function body)
    function_3 (1%, 1% in function body)

これを見て、「function_2の本文のコードで何かが時間がかかっています。プログラムを高速化したい場合は、そこから始めるべきです」と思います。

Pythonプログラム)のこの正確なプロファイリング出力を最も簡単に取得するにはどうすればよいですか?

私は人々がこれをするように言うのを見ました:

import cProfile, pstats
prof = cProfile.Profile()
prof = prof.runctx("real_main(argv)", globals(), locals())
stats = pstats.Stats(prof)
stats.sort_stats("time")  # Or cumulative
stats.print_stats(80)  # 80 = how many to print

しかし、それはそのエレガントなコールツリーと比較してかなり厄介です。これが簡単にできるかどうか教えてください。かなり役に立ちます。

28
user

コールグラフについては、このライブラリをチェックしてください http://pycallgraph.slowchop.com/ 。それは本当にうまくいきます。特定の機能のプロファイルを作成する場合は、 http://mg.pov.lt/blog/profiling.html を確認してください。

これは、profilehooksモジュールの結果です。

alt text

10
Falmarri

私もこれに出くわし、コールグラフを生成する方法を学ぶのに少し時間を費やしました(cProfileの通常の結果はそれほど有益ではありません)。今後の参考資料として、cProfile + gprof2dot + graphVizを使用して美しいコールツリーグラフィックを生成する別の方法があります。

———————

  1. GraphVizをインストールします: http://www.graphviz.org/Download_macos.php
  2. easy_install gprof2dot
  3. コードでプロファイルを実行します。

    python -m cProfile -o myLog.profile <myScript.py> arg1 arg2 ...
    
  4. Gprof2dotを実行して、コールプロファイルをドットファイルに変換します

    gprof2dot -f pstats myLog.profile -o callingGraph.dot
    
  5. GraphVizで開き、グラフを視覚化します

最終結果は次のようになります。グラフは色分けされています-赤は時間の集中度が高いことを意味します。

Graph is color-coded- red means higher concentration of time

50
Max Song

最近同じことをしたかったので、自分で実装することに挑戦しました。

プロジェクトはGitHubにあります https://github.com/joerick/pyinstrument

使用方法は次のとおりです。

from pyinstrument import Profiler

profiler = Profiler()
profiler.start()

# Code you want to profile

profiler.stop()

print(profiler.output_text())
23
joerick

gprof2dot アプローチはすべての情報をうまく抽出するので、私はファンです。ただし、コールツリーのタイミングデータを見たいことがあるので、 マグロ を作成しました。

enter image description here

でインストール

pip install tuna

でプロフィールを表示します

tuna program.prof

マグロは SnakeViz に触発されています。

0
Nico Schlömer