你如何让Python分析器工作?

时间:2013-04-18 04:15:22

标签: python profiler

我正在尝试按照此处的说明操作: 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工作,但它生成的文件是垃圾。

2 个答案:

答案 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足够好,那就是它。