我正在尝试按照此处的说明操作: 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工作,但它生成的文件是垃圾。
答案 0 :(得分:7)
实际上,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
的有效值为:call,cumulative,file,line,module,name,nfl(name / file / line),pcalls,stdname,time。
答案 1 :(得分:5)
2.7手册中的示例中的问题似乎是使用StringIO。当我使用Armin Rigo建议的真实文件时,该更改可以避免错误。咨询文档StringIO我注意到
StringIO对象可以接受Unicode或8位字符串,但混合两者可以采用>一些关心。如果两者都使用,则无法解释为7位ASCII的8位字符串(>>>使用第8位)将在调用getvalue()时引发UnicodeError。
getvalue()未在此处调用,失败的语句在pstats.py中,可能是print_stats()执行中的第一次打印尝试,还有几个要遵循:
print >> self.stream, indent, self.total_calls, "function calls",
我没有看到哪个打印参数导致问题,我没有看到如何让StringIO接受print_stats试图给它的任何东西 - 但是如果你只是完全省略了流,输出来了无论如何,在stdout上:
pr.enable()
(do the thing)
pr.disable()
pstats.Stats(pr).print_stats()
如果stdout足够好,那就是它。