【问题标题】:How do you get the Python profiler to work?如何让 Python 分析器工作?
【发布时间】:2013-04-18 04:15:21
【问题描述】:

我正在尝试按照此处的说明进行操作: 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 参数,得到 'str'

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

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

【问题讨论】:

    标签: python profiler


    【解决方案1】:

    确实,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、时间。

    【讨论】:

    【解决方案2】:

    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 试图给它的任何东西——但是,如果你完全省略流,输出就会出现无论如何都在标准输出上:

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

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

    【讨论】:

      猜你喜欢
      • 2010-10-02
      • 1970-01-01
      • 2015-05-21
      • 2011-08-14
      • 1970-01-01
      • 2012-07-14
      • 1970-01-01
      • 2011-09-11
      • 2011-07-09
      相关资源
      最近更新 更多