2010-04-29 58 views
3

我一直无法在网上找到它。我正在寻找使用探查器如何更好地优化我的代码,以及何时对哪些函数累计使用最多的时间进行排序,诸如str(),print和其他类似广泛使用的函数会占用大部分配置文件。分析python程序以获取用户定义函数的最佳方式是查看他们可以优化哪些代码区域?Python分析在Windows中,你如何忽略内建函数

我希望这是有道理的,你可以在这个问题上的任何光芒将非常感激。

回答

8

好吧,我假设你的真实的目标是让你的代码尽可能快地合理,对吧?

假设你通过找出函数需要多长时间来做到这一点是自然的,但还有另一种方法来看待它。

考虑到你的程序运行时会追踪一个调用树,它就像窗外的一棵真正的树。中继线就像main函数,任何分支从中分离出来就像调用另一个函数一样。

假设每个“叶”需要一定的时间,并且你想要做的是修剪树以便尽可能多地去除叶子。

一种方法是找到有很多叶子的树枝并切掉树叶。另一种方法是切断整个分支,如果你不需要它们。问题是找到你不需要的重型分支。

一个简单的方法就是随机选取几片叶子,如10个,每根叶子沿着它的分支沿着一条线回溯到树干。任何分支点都会有一些这样的线路贯穿它,从叶子到树干。通过该分支点的线数越多,该分支上的叶子就越多,并且通过修剪可以节省得越多。

Here's how you can apply this to your program.要对一片叶子进行采样,请随机暂停程序并查看调用堆栈。这是回到干线的线路。每个呼叫站点就可以了(不是功能,呼叫站点)是分支点。如果该呼叫站点占用了一部分样本,例如40%,那么通过修剪它大致可以节省多少。

所以,不要把它看作是测量函数需要多长时间。可以把它看作是询问哪些呼叫站点“重”。这里的所有都是它的。

+0

调查程序行为的一个有趣的方法。也许不是新奇的,但它真的驱使回家的问题“我的程序实际上在做什么?”谢谢! – 2010-04-30 03:36:06

+0

@stw_dev:你是对的,它是*方式*不是新的,只是没有教过,无论出于何种原因。 – 2010-04-30 11:50:11

+0

@Mike:您是否必须使用gprof才能做到这一点?我目前在Windows机器上为我想优化的代码。还是CProfile仍然有效?但是我完全把我的大脑包裹在它身上之后,这个解释很好。我忘了提及我正在使用Python(不是速度最快的语言) – 2010-04-30 15:14:30