Windows 中的 Python 分析,如何忽略内置函数
Posted
技术标签:
【中文标题】Windows 中的 Python 分析,如何忽略内置函数【英文标题】:Python Profiling In Windows, How do you ignore Builtin Functions 【发布时间】:2010-04-29 23:59:50 【问题描述】:我无法在网上的任何地方找到这个。我一直在寻找使用分析器如何更好地优化我的代码的方法,并且在按哪些函数累计使用时间最长进行排序时,str()、print 和其他类似的广泛使用的函数会占用大部分配置文件。分析 python 程序以获取用户定义的函数的最佳方法是什么,以查看他们可以优化的代码区域?
我希望这是有道理的,非常感谢您对这个主题的任何启发。
【问题讨论】:
【参考方案1】:好的,我认为您的真正目标是尽可能快地编写代码,对吧?
很自然地假设你通过找出你的函数需要多长时间来做到这一点,但还有另一种方式来看待它。
考虑一下,当您的程序运行时,它会追踪一个调用树,它有点像您窗口外的一棵真实树。主干就像main
函数,任何分支从中分离出来就像调用另一个函数。
假设每个“叶子”都需要一定的时间,而您要做的是修剪树,以便尽可能多地去除叶子。
一种方法是找到叶子很多的树枝并将叶子剪掉。另一种方法是在不需要时将整个树枝剪掉。问题是找到你不需要的繁重分支。
做到这一点的一个简单的方法是随机挑选几片叶子,比如 10 片,在每片叶子上,沿着它的树枝画一条线一直到树干。任何分支点都会有一些这样的线穿过它,从叶子到树干。穿过该分支点的线越多,该分支上的叶子就越多,通过修剪它可以节省更多。
Here's how you can apply this to your program. 要对叶子进行采样,您可以随机暂停程序并查看调用堆栈。那是回到主干的线路。它上面的每个调用站点(不是函数,调用站点)都是一个分支点。如果该调用站点位于样本的一小部分(例如 40%)上,那么这大致就是通过修剪它可以节省的成本。
因此,不要将其视为衡量函数需要多长时间。可以将其视为询问哪些呼叫站点“重”。仅此而已。
【讨论】:
调查程序行为的方法多么有趣。也许并不新奇,但它确实让我想到了“我的程序到底在做什么?”这个问题。谢谢! @stw_dev:你说得对,它方式不是新的,只是没有教过,无论出于何种原因。 @Mike:你必须使用 gprof 吗?我目前在 Windows 机器上寻找我想要优化的代码。还是 CProfile 仍然有效?但是,在我完全思考它之后,很好的解释。我忘了提到我正在使用 Python(在速度方面不是最好的语言) @Tim McJilton:你不会使用 gprof。 Python 有一个名为pdb
的调试器,它与gdb
非常相似。我很确定您可以使用 ctrl-C 或 ctrl-Break 暂停它。然后打印堆栈跟踪。 Python 有分析器,但我认为它们中的任何一个都没有真正做到这一点。
@Tim McJilton:快到了。随机停止 - 是的,但比查看它的功能更好,查看特定的代码行(这些是您唯一可以修复的事情)。嵌入?好吧,当手指不够快时,我使用了闹钟计时器。随机的?您不希望代码本身触发它们,因为您希望它无法预测代码正在做什么,但是用户输入期间的示例有点毫无意义。精度并不重要。我查看每个样本以了解它的作用和原因,因此我知道我是否需要它。这就是关键。以上是关于Windows 中的 Python 分析,如何忽略内置函数的主要内容,如果未能解决你的问题,请参考以下文章