這是對上一篇關於偵錯程式的文章的一個小小的補充。
標準庫有三種分析方法(cProfile和profile,hotshot)以及不計其數的第三方視覺化工具,轉化器,以及諸如此類的東西。
工具多了,不靠譜的建議自然少不了。
如果你不知道該用什麼,那就用一個視覺化的工具吧!
有很多的建議供你選擇自己要用的視覺化工具,但無論是使用如標準庫的Stats模組這種文字形式的還是像pycallgraph或者gprof2dot這樣的圖形化的庫,第一反應都是要寫程式碼來生成報表。
但是這個主意很糟糕,你需要不斷修改程式碼來改變或者探索報表的內容。如果你不是在尋找一塊特定的程式碼塊,那麼一切會變得混亂不堪。你很可能會錯過那些真正扼殺你程式效能的事情。
RunSnakeRun
你可以用pip install RunSnakeRun 或者 apt-get install runsnakerun來安裝或者從原始碼安裝。
RunSnakeRun 是一個全面的工具,很容易整合 – 你可以和cProfile/profile來配合使用,只需要給profile.run方法指定一個filename的引數即可,比如:
1 2 |
import cProfile cProfile.run("main()", filename="my.profile") |
然後,在終端裡執行:
1 |
runsnake my.profile |
結果看起來就像這樣:
這是可接受的,如果你的分析檔案不是特別大的話,它會工作的很好。比如:你只有一個佔用了太多執行時間的函式。
RunSnakeRun有一個記憶體除錯模式(需要Meliae)。遺憾的是我還沒有試過。但是如果你想看到記憶體的使用情況,它看起來確實很有用。就像這樣。
KCachegrind
你可以用apt-get install kcachegrind 來安裝或者從原始碼安裝。
鮮為人知的祕密:有windows版本的KCachegrind二進位制包。 只需要安裝windows版本的KDE,然後在選項“開發者工具”選中它,很可能要取消選擇其他項)。
我真的很喜歡這工具!它可以向你展示呼叫樹的圖表,可排序的呼叫表,呼叫/被呼叫的地圖,原始碼,而且你還能選擇過濾掉所有的東西。而且它是語言無關的 – 如果你有C/C++背景的話,你很可能聽說過這個工具。
我喜歡這個工具的程度超過RunSnakeRun,因為它比後者功能要強大的多:
- 在呼叫數的圖表上,你可以排序,改變佈局/用很多方法來渲染或者匯出成點圖/png,RunSnakeRun甚至不能顯示呼叫樹的圖表
- 你可以看見原始碼
- 你可以得到被呼叫地圖
- 更容易安裝(不需要依賴wxPython)
在大專案裡面哪些需要關注並不是那麼顯而易見,或者有很多的相關函式時,KCachegrind比RunSnakeRun更值得一用。
可生成KCachegrind 分析檔案的工具
我想這是唯一的缺點,你需要用這種特殊的格式匯出。但是它也有很好的支援:
- django擴充套件的runprofileserver
- kcachegrind 轉換器
- repoze.profile – 只需要設定cachegrind_filename
我使用的是函式裝飾器,無非在你的/tmp目錄下多了些匯出的分析檔案。
附上截圖:
還有值得一提的工具?請評論留言!