2010-04-29 53 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