我想知道個人Python應用程序的內存使用狀況,而且特別想知道哪些代碼塊/部分或對象佔用了大部份內存。 Google搜索顯示商業廣告是Python Memory Validator (僅限Windows)。 html
我沒有嘗試任何人,因此我想知道哪個是最好的考慮: 瀏覽器
提供大部分細節。 socket
我必須對代碼進行最少或不作任何更改。 函數
因爲沒有人提到它,我將指向個人模塊memory_profiler ,它可以打印內存使用的逐行報告,而且能夠在Unix和Windows上運行(最後一個須要psutil)。 輸出不是很詳細,但目標是概述代碼消耗更多內存的位置,而不是對分配的對象進行詳盡的分析。 工具
使用@profile
函數並使用-m memory_profiler
標誌運行代碼後,它將打印逐行報告,以下所示: ui
Line # Mem usage Increment Line Contents ============================================== 3 @profile 4 5.97 MB 0.00 MB def my_func(): 5 13.61 MB 7.64 MB a = [1] * (10 ** 6) 6 166.20 MB 152.59 MB b = [2] * (2 * 10 ** 7) 7 13.61 MB -152.59 MB del b 8 13.61 MB 0.00 MB return a
我推薦Dowser 。 它很容易設置,您只需對代碼進行零更改。 您能夠經過簡單的Web界面查看每種類型的對象的計數,查看活動對象列表,查看活動對象的引用。 spa
# memdebug.py import cherrypy import dowser def start(port): cherrypy.tree.mount(dowser.Root()) cherrypy.config.update({ 'environment': 'embedded', 'server.socket_port': port }) cherrypy.server.quickstart() cherrypy.engine.start(blocking=False)
導入memdebug,並調用memdebug.start。 就這樣。 .net
我沒有嘗試過PySizer或Heapy。 我會很感激別人的評論。 debug
UPDATE
上面的代碼是針對CherryPy 2.X
, CherryPy 3.X
的, server.quickstart
方法已被刪除,而engine.start
沒有采用blocking
標誌。 因此若是你使用的是CherryPy 3.X
# memdebug.py import cherrypy import dowser def start(port): cherrypy.tree.mount(dowser.Root()) cherrypy.config.update({ 'environment': 'embedded', 'server.socket_port': port }) cherrypy.engine.start()
Heapy使用起來很是簡單。 在代碼中的某個時刻,您必須編寫如下內容:
from guppy import hpy h = hpy() print h.heap()
這給你一些像這樣的輸出:
Partition of a set of 132527 objects. Total size = 8301532 bytes. Index Count % Size % Cumulative % Kind (class / dict of class) 0 35144 27 2140412 26 2140412 26 str 1 38397 29 1309020 16 3449432 42 tuple 2 530 0 739856 9 4189288 50 dict (no owner)
您還能夠找出引用對象的位置並獲取有關該對象的統計信息,但不知何故,文檔上的文檔有點稀疏。
還有一個用Tk編寫的圖形瀏覽器。
Muppy是(又一個)Python的內存使用分析器。 該工具集的重點是識別內存泄漏。
Muppy試圖幫助開發人員識別Python應用程序的內存泄漏。 它能夠在運行時跟蹤內存使用狀況,並識別泄漏的對象。 另外,提供了容許定位未釋放對象的源的工具。
考慮objgraph庫(參見 http://www.lshift.net/blog/2008/11/14/tracing-python-memory-leaks示例用例)。