如何使Python分析器正常工作?


问题内容

我正在尝试按照此处的说明进行操作: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()

当前结果是:预期/ inspection-summary / unicode参数处的TypeError,得到了’str’

(输出看起来像这样,因为我正在使用Django来调用有问题的代码)。

那么,有谁知道我怎样才能使探查器真正正常工作?我只希望它像预期的那样进行概要分析,然后将结果打印到文件中,以便稍后在执行后查看结果。我可以使dump_stats正常工作,但是它产生的文件是垃圾。


问题答案:

实际上,配置文件/
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包括:调用,累计,文件,行,模块,名称,nfl(用于名称/文件/行),调用,标准名称,时间。