1

我尝试使用 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
4

1 回答 1

1

我只是查看了文档,它说的是如果在单个堆栈示例中多次遇到一个过程,它只计算一次。(我在这里假设“过程”一词实际上应该是“过程中的代码行”。)

这意味着 - 如果正在进行递归,您不希望函数的时间成本被递归的深度人为地放大。

另外,我会指出一些其他的事情(这里有更详细的解释):

第一列是“%时间”,不计算孩子,即自我百分比。这是一个无用的统计数据,因为几乎没有任何东西不是过程调用,并且查看该行可以判断它是否是过程调用。

第二列是“累计时间”,包括孩子。这很好,但它应该是百分比,这样您就不必除以总时间来查看百分比。数字很​​重要的原因是它代表了线路的职责——如果线路不存在,可以节省的总时间的一部分。

第三列是“自我时间”,正如我所解释的,这是一个无用的统计数据。它非常小或为零的事实反映了它的无用性。由于它包含在累计时间中,如果不是非常小,累计时间也会显示,所以它没有告诉你累计时间没有。

此外,正如作者指出的那样,样本在 I/O 期间被暂停,因此,如果它正在执行一些您不想要或不要求的 I/O,请深入某个库,如果这会使程序花费 100 次只要不是这样,分析器(和您)将完全不知道它。

于 2012-08-06T14:56:17.350 回答