Python Profiling - 我的代码之外的汇总函数调用

Posted

技术标签:

【中文标题】Python Profiling - 我的代码之外的汇总函数调用【英文标题】:Python Profiling - Rollup function calls that are outside my code 【发布时间】:2012-11-02 16:49:08 【问题描述】:

我正在尝试分析我们的 django 单元测试(如果测试更快,我们会更频繁地运行它们)。我已经通过 python 内置的 cProfile 分析器运行它,生成了一个 pstats 文件。

但是信噪比很差。列出的功能太多。当我进行一个数据库查询时,会调用很多很多 django 内部函数。这让人很难看到发生了什么。

我是否可以“汇总”某个目录之外的所有函数调用?

例如如果我在我的目录之外调用一个 python 函数,然后它调用 5 个其他函数(都在我的目录之外),那么它应该把所有这些都汇总起来,所以看起来只有一个函数调用,它应该显示累积时间对于整个事情。

如果你想分析(比如)Django,这显然是不好的,但我不想这样做。

我查看了 pstats.Stats 对象,但看不到修改此数据的明显方法。

【问题讨论】:

【参考方案1】:

我对 python 的经验很少,但在性能调优方面有很多经验,所以这里有一个可能性:

    与其将分析作为单元测试的一部分运行,不如只进行总体执行时间测量。如果这些变化不大,那就没问题了。

    当您确实检测到更改时,或者如果您只是想让事情运行得更快,请使用this method。正如您所说,它具有更高的“信噪比”。

不同之处在于您不希望分析器能够找出您需要查看的内容。它更像是调试器中的断点,断点不是发生在您选择的位置,而是很有可能发生在不必要的缓慢时。 如果在两次或更多情况下,您看到它在做一些可能会被更好的东西取代的事情,平均而言,它会得到回报,并且修复它会使其他问题更容易通过相同的方法找到。

【讨论】:

随着我们的代码库的增长,我们的单元测试已经慢慢添加和增长,这是一件好事。我们正处于重新测试所需的约 2 小时令人讨厌的阶段。如果它更快,那就太好了。我希望有一些唾手可得的果实,而找出答案的最佳方法是对其进行分析。肯定有一些使用时间的辅助函数,我想找出来。 @Rory:“希望有一些低调的果实,找出答案的最好方法是分析它”。让我换一种说法:“典型程序的优化机会可以通过分析器有效地找到。”你不是唯一一个这样想的人,但并非如此。它没有任何理由,形式上或实际。考虑到这一点,SO 充满了人们试图理解分析器输出的问题。 Here's more on all that.

以上是关于Python Profiling - 我的代码之外的汇总函数调用的主要内容,如果未能解决你的问题,请参考以下文章

Google Cloud Profiling 如何通过分析优化我的代码?

如何在 IPython 中运行 shell 命令? (Python Profiling GUI 工具)

数据分析可视化利器:python pandas-profiling 一行代码EDA 探索性数据分析

生成数据的详细报告pandas-profiling库(python3)

生成数据的详细报告pandas-profiling库(python3)

当 JS Profiling 开启时,JavaScript 代码运行得更快?啥?