在Windows中进行Python评测时,如何忽略内置函数

在Windows中进行Python评测时,如何忽略内置函数,python,optimization,profiling,built-in,cprofile,Python,Optimization,Profiling,Built In,Cprofile,我没有能力在网上任何地方找到这个。我想知道如何使用分析器更好地优化我的代码,在排序时,哪些函数累积使用的时间最多,像str()、print和其他类似的广泛使用的函数占用了大部分的配置文件。评测python程序以获得用户定义函数的最佳方法是什么,以便只查看它们可以优化代码的哪些区域 我希望这是有意义的,如果您能对这个主题有所了解,我们将不胜感激。好的,我认为您的真正目标是尽可能快地编写代码,对吗 很自然地,我们会假设您是通过了解函数需要多长时间来完成这项工作的,但有另一种方式来看待它 考虑一下,当

我没有能力在网上任何地方找到这个。我想知道如何使用分析器更好地优化我的代码,在排序时,哪些函数累积使用的时间最多,像str()、print和其他类似的广泛使用的函数占用了大部分的配置文件。评测python程序以获得用户定义函数的最佳方法是什么,以便只查看它们可以优化代码的哪些区域

我希望这是有意义的,如果您能对这个主题有所了解,我们将不胜感激。

好的,我认为您的真正目标是尽可能快地编写代码,对吗

很自然地,我们会假设您是通过了解函数需要多长时间来完成这项工作的,但有另一种方式来看待它

考虑一下,当你的程序运行时,它会跟踪出一个调用树,这有点像你窗口外的一个真正的树。主干类似于
main
函数,任何分支从主干中分离出来就像调用另一个函数

假设每个“叶子”都需要一定的时间,你要做的是修剪树木,以便尽可能多地去掉叶子

一种方法是找到有很多叶子的树枝,然后把叶子剪掉。另一种方法是,如果你不需要的话,把整根树枝都剪掉。问题是找到你不需要的沉重的树枝

一个简单的方法是随机挑选几片叶子,比如10片,在每片叶子上,沿着树枝一直追溯到树干。任何分支点都会有一些这样的线穿过它,从叶子到树干。穿过该分支点的线条越多,该分支上的叶子就越多,修剪它可以节省的资源就越多

要对叶进行采样,您可以随机暂停程序并查看调用堆栈。那是回后备箱的线。其中的每个调用站点(不是函数,而是调用站点)都是一个分支点。如果该调用站点位于部分样本上,比如40%,那么这大概就是通过修剪它可以节省的数量


所以,不要把它看作是测量函数需要多长时间。可以将其视为询问哪些呼叫站点“繁忙”。这就是它的全部。

这是一种多么有趣的程序行为调查方法。也许这并不新奇,但它确实让人明白了“我的程序到底在做什么?”这一问题,谢谢@stw_-dev:你说得对,这不是新的,只是没有教过,不管是什么原因。@Mike:你必须使用gprof才能做到吗?我目前在Windows计算机上运行要优化的代码。还是CProfile仍然有效?但在我完全绞尽脑汁之后,这是一个很好的解释。我忘了提到我在使用Python(在速度方面不是最好的语言)@Tim McJilton:你不会使用gprof的。Python有一个名为
pdb
的调试器,非常类似于
gdb
。我很确定你可以用ctrl-C或ctrl-Break暂停。然后打印堆栈跟踪。Python有分析器,但我认为它们中没有一个真的能做到这一点。@Tim McJilton:差不多了。随机停止-是的,但要比查看它所在的函数更好,请查看特定的代码行(这些是您唯一可以修复的)。嵌入嗯,我在手指不够快的时候用过闹钟计时器。随机的您不希望代码本身触发它们,因为您希望代码所做的事情是不可预测的,但是用户输入过程中的示例是毫无意义的。精确性并不重要。我查看每个样本以了解它在做什么和为什么,这样我就知道我是否需要它。这是关键。