web-dev-qa-db-ja.com

データをファイルに保存するcProfileが文字の寄せ集めを引き起こす

Bot4CA.pyというモジュールでcProfileを使用しているので、コンソールで次のように入力します。

python -m cProfile -o thing.txt bot4CA.py

モジュールが実行されて終了すると、thing.txtという名前のファイルが作成され、それを開くといくつかの情報があります。残りは、きちんと整理されたデータのファイルではなく、文字の寄せ集めです。 cProfileの使用方法を知っている人はいますか? .txtファイルのデータの例を次に示します。

{(   s)   build\bdist.win32\Egg\colorama\winterm.pyi'   t      reset_all(   i   i   gpàÂs% ?geOÙHÌœE?{(   s-   build\bdist.win32\Egg\colorama\ansitowin32.pyi¥

私が本当に欲しいのは、cProfile.run()を呼び出すと何が起こるかです。このプログラムはかなり大きく、たくさん実行されるので、ファイルではなく、印刷ではなくすべての関数の実行時間を示すきれいに整理されたテーブルが印刷されます機能の。

41
joseph

pstatsモジュールを使用してこのファイルを解析し、ユーザーフレンドリーな形式で情報を抽出する必要があります。例えば:

import pstats
p = pstats.Stats('thing.txt')
p.sort_stats('cumulative').print_stats(10)

もちろん、それはすべて ドキュメント内 です。そこにある「インスタントユーザーズマニュアル」に目を通すと、すべてが説明されます。

58
Eli Bendersky

統計を適切にダンプするには:

echo 'stats' | python3 -m pstats path/to/cprofile_output_file

pstatsにはシェルもあります

$ python3 -m pstats path/to/cprofile_output_file

その中で、次のようなstatsまたはsortコマンドを発行できます。

$ python3 -m pstats path/to/cprofile_output_file
Welcome to the profile statistics browser.
prof.txt% sort cumtime
prof.txt% reverse
prof.txt% stats

   Ordered by: standard name

   ncalls  tottime  percall  cumtime  percall filename:lineno(function)
        1    0.000    0.000    0.000    0.000 63: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 {built-in method builtins.print}
        1    0.000    0.000    0.000    0.000 {method 'disable' of '_lsprof.Profiler' objects}

prof.txt% ?

Documented commands (type help <topic>):
========================================
EOF  add  callees  callers  help  quit  read  reverse  sort  stats  strip

ここで楽しんだマイクロ機能は、ソート順序をネイティブに逆にすることです<3

echo -e 'sort cumtime\nreverse\nstats' | python3 -m pstats path/to/cprofile_output_file
10
ThorSummoner