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 argument expected, got '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:调用、累积、文件、行、模块、名称、nfl(用于名称/文件/行)、pcalls、stdname、时间。

于 2013-04-18T08:03:03.070 回答
6

2.7手册中示例中的问题似乎是使用StringIO。当我按照 Armin Rigo 的建议使用真实文件时,该更改可以避免错误。查阅我注意到的 doc re 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()

如果标准输出足够好,就是这样。

于 2013-04-27T23:27:00.877 回答