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 多次出现相同的过程的主要内容,如果未能解决你的问题,请参考以下文章

如何知道 Python 编程是不是在探查器下运行?

使用 statprof 分析 Django 视图 - 不能在线程中使用信号

覆盖和探查器的组合?

SQL 探查器和调优顾问

探查器如何对正在运行的程序进行采样?

实体框架探查器 - 带有 EF 6 的 ASP.NET MVC4 - 无法确定提供程序名称