我常用的Python除錯工具(二)

高磊發表於2013-12-09

這是對上一篇關於偵錯程式的文章的一個小小的補充。

標準庫有三種分析方法(cProfile和profilehotshot)以及不計其數的第三方視覺化工具,轉化器,以及諸如此類的東西。

工具多了,不靠譜的建議自然少不了。

 

如果你不知道該用什麼,那就用一個視覺化的工具吧!

有很多的建議供你選擇自己要用的視覺化工具,但無論是使用如標準庫的Stats模組這種文字形式的還是像pycallgraph或者gprof2dot這樣的圖形化的庫,第一反應都是要寫程式碼來生成報表。

但是這個主意很糟糕,你需要不斷修改程式碼來改變或者探索報表的內容。如果你不是在尋找一塊特定的程式碼塊,那麼一切會變得混亂不堪。你很可能會錯過那些真正扼殺你程式效能的事情。

 

RunSnakeRun

你可以用pip install RunSnakeRun 或者 apt-get install runsnakerun來安裝或者從原始碼安裝。

RunSnakeRun 是一個全面的工具,很容易整合 – 你可以和cProfile/profile來配合使用,只需要給profile.run方法指定一個filename的引數即可,比如:

然後,在終端裡執行:

結果看起來就像這樣:

這是可接受的,如果你的分析檔案不是特別大的話,它會工作的很好。比如:你只有一個佔用了太多執行時間的函式。

RunSnakeRun有一個記憶體除錯模式(需要Meliae)。遺憾的是我還沒有試過。但是如果你想看到記憶體的使用情況,它看起來確實很有用。就像這樣

 

KCachegrind

你可以用apt-get install kcachegrind 來安裝或者從原始碼安裝。

鮮為人知的祕密:有windows版本的KCachegrind二進位制包。 只需要安裝windows版本的KDE,然後在選項“開發者工具”選中它,很可能要取消選擇其他項)。

我真的很喜歡這工具!它可以向你展示呼叫樹的圖表,可排序的呼叫表,呼叫/被呼叫的地圖,原始碼,而且你還能選擇過濾掉所有的東西。而且它是語言無關的 – 如果你有C/C++背景的話,你很可能聽說過這個工具。

我喜歡這個工具的程度超過RunSnakeRun,因為它比後者功能要強大的多:

  • 在呼叫數的圖表上,你可以排序,改變佈局/用很多方法來渲染或者匯出成點圖/png,RunSnakeRun甚至不能顯示呼叫樹的圖表
  • 你可以看見原始碼
  • 你可以得到被呼叫地圖
  • 更容易安裝(不需要依賴wxPython)

在大專案裡面哪些需要關注並不是那麼顯而易見,或者有很多的相關函式時,KCachegrind比RunSnakeRun更值得一用。

可生成KCachegrind 分析檔案的工具

我想這是唯一的缺點,你需要用這種特殊的格式匯出。但是它也有很好的支援:

我使用的是函式裝飾器,無非在你的/tmp目錄下多了些匯出的分析檔案。

附上截圖:

還有值得一提的工具?請評論留言!

相關文章