如何让Python分析器工作?

如何让Python分析器工作?,python,profiler,Python,Profiler,我试着按照这里的说明来做: 具体而言,本部分: 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类的真正方法,它似乎也不存在于任何地方。这是我目前的代码: im

我试着按照这里的说明来做:

具体而言,本部分:

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()
目前的结果是: 检验/检验汇总时的类型错误/ 应为unicode参数,得到'str'

(输出看起来像这样,因为我正在使用Django调用相关代码)


那么,有人知道我怎样才能让分析器真正工作吗?我只想让它像预期的那样进行配置,然后将结果打印到文件中,这样我可以在执行后查看结果。我可以让dump_stats工作,但它生成的文件是垃圾。

事实上,profile/pstats模块的API看起来相当特别。我认为行
ps.print\u results()
应该是一个通用的行,也就是说,它应该写为
ps。调用一些方法来打印结果()
,但这并不清楚。至于
dump\u 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(用于名称/文件/行)、pcall、stdname、时间。

2.7手册示例中的问题似乎是使用StringIO。当我使用Armin Rigo建议的真实文件时,这种更改可以避免错误。查阅我的笔记

StringIO对象可以接受Unicode或8位字符串,但混合使用这两种字符串可能需要>一些注意。如果两者都使用,则无法解释为7位ASCII(即>>使用第8位)的8位字符串将在调用getvalue()时引发UnicodeError

此处未调用getvalue(),失败的语句位于pstats.py中,这可能是print_stats()执行中的第一次打印尝试,后面还有几次:

 print >> self.stream, indent, self.total_calls, "function calls",
我不知道是哪个print参数导致了这个问题,我也不知道如何让StringIO接受print_stats试图给出的任何数据流——但是,如果您只是完全忽略了流,输出结果还是会出现在stdout上:

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

如果stdout足够好,就是这样。

+1文档中的代码片段与ps.print_results()行相混淆。