現在我們對計時有了較好的理解,那麼讓我們繼續弄清楚程式使用了多少記憶體。我們很幸運,fabian pedregosa模仿robert kern的line_profiler實現了乙個不錯的記憶體分析器。
首先使用pip安裝:
這裡建議安裝psutil包,因為它可以大大改善memory_profiler的效能)。
就像line_profiler,memory_profiler也需要在感興趣的函式上面裝飾@profile裝飾器:
想要觀察你的函式使用了多少記憶體,像下面這樣執行:
一旦程式退出,你將會看到看起來像這樣的輸出:
line_profiler和memory_profiler的ipython快捷方式
memory_profiler和line_profiler有乙個鮮為人知的小竅門,兩者都有在ipython中的快捷命令。你需要做的就是在ipython會話中輸入以下內容:
在這樣做的時候你需要訪問魔法命令%lprun和%mprun,它們的行為類似於他們的命令列形式。主要區別是你不需要使用@profiledecorator來修飾你要分析的函式。只需要在ipython會話中像先前一樣直接執行分析:
這樣可以節省你很多時間和精力,因為你的源**不需要為使用這些分析命令而進行修改。
cpython直譯器使用引用計數做為記錄記憶體使用的主要方法。這意味著每個物件包含乙個計數器,當某處對該物件的引用被儲存時計數器增加,當引用被刪除時計數器遞減。當計數器到達零時,cpython直譯器就知道該物件不再被使用,所以刪除物件,釋放占用的記憶體。
如果程式中不再被使用的物件的引用一直被占有,那麼就經常發生記憶體洩漏。
查詢這種「記憶體洩漏」最快的方式是使用marius gedminas編寫的objgraph,這是乙個極好的工具。該工具允許你檢視記憶體中物件的數量,定位含有該物件的引用的所有**的位置。
一開始,首先安裝objgraph:
一旦你已經安裝了這個工具,在你的**中插入一行宣告呼叫偵錯程式:
最普遍的物件是哪些?
在執行的時候,你可以通過執行下述指令檢視程式中前20個最普遍的物件:
哪些物件已經被新增或刪除?
我們也可以檢視兩個時間點之間那些物件已經被新增或刪除:
誰引用著洩漏的物件?
繼續,你還可以檢視**包含給定物件的引用。讓我們以下述簡單的程式做為乙個例子:
想要看看**包含變數x的引用,執行objgraph.show_backref()函式
該命令的輸出應該是一副png影象,儲存在/tmp/backrefs.png,它看起來是像這樣:
最下面有紅字的盒子是我們感興趣的物件。我們可以看到,它被符號x引用了一次,被列表y引用了三次。如果是x引起了乙個記憶體洩漏,我們可以使用這個方法,通過跟蹤它的所有引用,來檢查為什麼它沒有自動的被釋放。
回顧一下,objgraph 使我們可以:
Oprofile CPU效能分析工具指南
在平台公升級中經常碰到自測時效能指標沒有問題,而平台轉到產品業務部門匹配測試時就出了問題.如果是功能異常的問題,一般還是很好處理的,但如果碰到系統的效能問題,如cpu公升高,記憶體使用超標,就比較不好搞了,老虎吞天,沒有目標,乙個版本幾十萬行 一行行看,絕對能累死,尤其是核心組.幸好開源界的風氣好,...
Jenkins 權威指南 中文版
前段時間由於工作和學習的需要,我打算深入研究jenkins這個工具 於是在網上查詢關於jenkins的教程,發現國內網上關於jenkins的教程資料少得可憐 除了jenkins官網上的使用者使用手冊外,就沒有比較系統地講述jenkins的教程了。無意間發現了這本 jenkins the defini...
css權威指南中的定位原理
替換元素的定位規則。1.如果width設定為auto,width的實際使用值由元素內容的固有寬度決定。因此,如果乙個影象的寬度是50畫素,使用值則計算為50px。如果顯式宣告了width,則width設定為該值。2.在從左到右的語言中,如果left值為auto,要把auto替換為靜態位置。在從右到左...