以前は、SystemMonitorアプリケーションに組み込まれているNice Appleプロファイラーを使用していました。C++コードがデバッグ情報を使用してコンパイルされている限り、実行中のアプリケーションをサンプリングして、親関数の時間の何パーセントがこの関数(および本体と他の関数呼び出し)に費やされたかを示すインデントされたツリー。
たとえば、mainがfunction_1
およびfunction_2
を呼び出した場合、function_2
はfunction_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
しかし、それはそのエレガントなコールツリーと比較してかなり厄介です。これが簡単にできるかどうか教えてください。かなり役に立ちます。
コールグラフについては、このライブラリをチェックしてください http://pycallgraph.slowchop.com/ 。それは本当にうまくいきます。特定の機能のプロファイルを作成する場合は、 http://mg.pov.lt/blog/profiling.html を確認してください。
これは、profilehooksモジュールの結果です。
私もこれに出くわし、コールグラフを生成する方法を学ぶのに少し時間を費やしました(cProfileの通常の結果はそれほど有益ではありません)。今後の参考資料として、cProfile + gprof2dot + graphVizを使用して美しいコールツリーグラフィックを生成する別の方法があります。
———————
easy_install gprof2dot
コードでプロファイルを実行します。
python -m cProfile -o myLog.profile <myScript.py> arg1 arg2 ...
Gprof2dotを実行して、コールプロファイルをドットファイルに変換します
gprof2dot -f pstats myLog.profile -o callingGraph.dot
GraphVizで開き、グラフを視覚化します
最終結果は次のようになります。グラフは色分けされています-赤は時間の集中度が高いことを意味します。
最近同じことをしたかったので、自分で実装することに挑戦しました。
プロジェクトは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())