Python 探查器 Statprof 多次出现相同的过程
Posted
技术标签:
【中文标题】Python 探查器 Statprof 多次出现相同的过程【英文标题】:Python profiler Statprof gives multiple occurrence of same procedure 【发布时间】:2012-08-06 12:13:04 【问题描述】:我尝试使用 Python 分析器 statprof 来分析我的一些代码。该文档说,如果多次遇到一个过程,则只计算一次。但是,在配置文件的输出中,我看到同一过程多次出现,但行号不同。有人知道这可能会显示什么吗?
例如输出
0.00 0.01 0.00 box.py:1305:**do_forever**
0.00 0.01 0.00 httplib.py:981:_send_request
0.00 0.01 0.00 box.py:1295:**do_forever**
0.00 0.01 0.00 box.py:1295:**do_forever**
0.00 0.01 0.00 sre_compile.py:486:_code
0.00 0.01 0.00 box.py:923:get_user_file_info
0.00 0.00 0.00 box.py:776:update_all_internal_user_stats_batch
【问题讨论】:
【参考方案1】:我刚刚查看了文档,它说如果在单个堆栈示例中多次遇到一个过程,它只会计算一次。 (我假设这里的“过程”一词实际上应该是“过程中的代码行”。)
这意味着 - 如果正在进行递归,您不希望函数的时间成本被递归的深度人为放大。
另外,我还要指出一些其他的事情(explained in more detail here):
第一列是“% time”,不包括孩子,即自我百分比。这是一个无用的统计数据,因为几乎没有任何东西不是过程调用,并且查看该行可以判断它是否是过程调用。
第二列是“累计时间”,包括孩子。这很好,但它应该是百分比,这样您就不必除以总时间来查看百分比。 数字很重要的原因是它代表了线路负责的内容 - 如果线路不存在,可以节省的总时间的一部分。
第三列是“自我时间”,正如我所解释的,这是一个无用的统计数据。 它非常小或为零的事实反映了它的无用性。 既然是包含在累计时间里的,如果不是特别小,累计时间也会显示出来,所以没有告诉你累计时间没有。
另外,正如作者所指出的,样本在 I/O 期间会暂停, 因此,如果它正在执行一些您不想要或不要求的 I/O,在某个库的深处, 如果这使程序花费的时间是其他情况的 100 倍, 探查器(和您)将完全不知道它。
【讨论】:
感谢 Mike 的详细解释。我只是对多个条目感到困惑。其他术语的含义很清楚。不过还是谢谢 @auny:不客气,祝你好运。顺便说一句,当我在 Python 中工作时,this is how I find out what needs to be fixed.以上是关于Python 探查器 Statprof 多次出现相同的过程的主要内容,如果未能解决你的问题,请参考以下文章