6

ここの指示に従おうとしています: http://docs.python.org/2/library/profile.html#module-cProfile

具体的には、この部分:

import cProfile, pstats, io
pr = cProfile.Profile()
pr.enable()
... do something ...
pr.disable()
s = io.StringIO()
ps = pstats.Stats(pr, stream=s)
ps.print_results()

print_results が Stats クラスの実際のメソッドではなく、実際にはどこにも存在しないように思われることは既に確認済みです。これが私の現在のコードです:

import cProfile, pstats, io
def foo(request):
    pr = cProfile.Profile()
    pr.enable()
    pass
    pr.disable()
    s = io.StringIO()
    ps = pstats.Stats(pr, stream = s)
    f = open('/profstats', 'a')
    ps.print_stats()
    f.write(s.getvalue())
    s.close()
    f.close()

現在の結果は次のとおりです: TypeError at /inspection-summary/ unicode 引数が必要で、'str' を取得しました

(問題のコードを呼び出すために Django を使用しているため、出力は次のようになります)。

では、プロファイラーを実際に機能させる方法を知っている人はいますか? 想定どおりにプロファイリングし、結果をファイルに出力して、実行後に後で結果を表示できるようにしたいだけです。dump_stats を動作させることはできますが、生成されるファイルはガベージです。

4

2 に答える 2

8

確かに、profile/pstats モジュールの API はかなりアドホックに見えます。ps.print_results()この行は一般的なもの、つまり のように書かれるべきだと思いますps.call_some_methods_to_print_the_result()が、これははっきりしていません。実際にdump_stats()は、後で再ロードできるバイナリファイルを保存します。

これが私のために働く例です:

import cProfile, pstats
pr = cProfile.Profile()
pr.enable()
...
pr.disable()

f = open('x.prof', 'a')
sortby = 'cumulative'
pstats.Stats(pr, stream=f).strip_dirs().sort_stats(sortby).print_stats()
f.close()

有効な値はsortby、calls、cumulative、file、line、module、name、nfl (name/file/line)、pcalls、stdname、time です。

于 2013-04-18T08:03:03.070 に答える
6

2.7 マニュアルの例の問題は、StringIO の使用のようです。Armin Rigo の提案に従って実際のファイルを使用すると、その変更によってエラーが回避されます。ドキュメント re StringIOを参照することに注意してください

StringIO オブジェクトは Unicode または 8 ビット文字列のいずれかを受け入れることができますが、2 つを混在させるには注意が必要です。両方が使用されている場合、7 ビット ASCII として解釈できない 8 ビット文字列 (> > 8 番目のビットを使用) は、getvalue() が呼び出されたときに UnicodeError が発生する原因になります。

getvalue() はここでは呼び出されていません。失敗したステートメントは pstats.py にあります。おそらく、print_stats() 実行での最初の印刷試行であり、さらにいくつかの結果が続きます。

 print >> self.stream, indent, self.total_calls, "function calls",

どの印刷引数が問題を引き起こしているのかわかりません。また、print_stats が与えようとしているものを StringIO が受け入れるようにする方法もわかりません。ただし、ストリームを完全に省略した場合、出力は stdout に出力されます。とりあえず:

pr.enable()
(do the thing)
pr.disable()
pstats.Stats(pr).print_stats()

stdout で十分であれば、それだけです。

于 2013-04-27T23:27:00.877 に答える