2010-12-11 60 views
5

我需要檢查我在python中使用的對象的內存統計信息。
我遇到了guppy和pysizer,但它們不適用於python2.7。
是否有可用於python 2.7的內存分析器?
如果不是,我可以自己做嗎?是否有python2.7的內存分析器?

+0

你真的*需要分析你的代碼嗎?只是問問! – user225312 2010-12-11 12:41:33

+0

「檢查對象的內存統計信息」爲什麼?你有什麼具體的問題?內存不足?分析通常不是必需的,通常很明顯*哪個對象太大。請解釋您實際觀察到的問題。 – 2010-12-11 14:19:31

+2

[Python內存分析器]的可能重複(http://stackoverflow.com/questions/110259/python-memory-profiler) – 2010-12-11 15:25:18

回答

2

你可能想嘗試下面的代碼適應您的具體情況並支持您的數據類型:

import sys 


def sizeof(variable): 
    def _sizeof(obj, memo): 
     address = id(obj) 
     if address in memo: 
      return 0 
     memo.add(address) 
     total = sys.getsizeof(obj) 
     if obj is None: 
      pass 
     elif isinstance(obj, (int, float, complex)): 
      pass 
     elif isinstance(obj, (list, tuple, range)): 
      if isinstance(obj, (list, tuple)): 
       total += sum(_sizeof(item, memo) for item in obj) 
     elif isinstance(obj, str): 
      pass 
     elif isinstance(obj, (bytes, bytearray, memoryview)): 
      if isinstance(obj, memoryview): 
       total += _sizeof(obj.obj, memo) 
     elif isinstance(obj, (set, frozenset)): 
      total += sum(_sizeof(item, memo) for item in obj) 
     elif isinstance(obj, dict): 
      total += sum(_sizeof(key, memo) + _sizeof(value, memo) 
         for key, value in obj.items()) 
     elif hasattr(obj, '__slots__'): 
      for name in obj.__slots__: 
       total += _sizeof(getattr(obj, name, obj), memo) 
     elif hasattr(obj, '__dict__'): 
      total += _sizeof(obj.__dict__, memo) 
     else: 
      raise TypeError('could not get size of {!r}'.format(obj)) 
     return total 
    return _sizeof(variable, set()) 
+0

看起來很有前途,但我認爲你應該把它改成'def getsizeof(obj,memo = None):'並且把'memo'的初始化移動到函數中,如果備忘錄是None:memo = set()'。當然,所有對'getsizeof()'的遞歸調用都需要自己的參數交換。 – martineau 2010-12-12 14:12:59

+1

@馬蒂諾:一個不應該隨便扔在新手道路上的承諾。通過舊/新的複雜性來處理類的實例,有/無'__slots__',沒有/單/多重繼承等是一場噩夢。例如參見http://code.activestate.com/recipes/546530-size-of-python-objects-revised/,它花費了超過2000個SLOC和多個版本,以使其成爲未知的錯誤州。我同意你對「備忘錄」的評論。 – 2010-12-12 20:34:53

+0

@John Machin:現在的狀態配方現在更接近3000行源代碼,並且是5.12版本,所以一般情況下顯然是一個很難破解的蛋 - 這是我發現@Noctis Skytower的答案很有趣的原因之一,因爲經常有一個並不需要一種能夠處理所有可能的案例的工具,只有他們自己的一小部分。希望'系統。getsizeof()'將在未來得到改善 - 我從來沒有真正需要它,所以只知道它沒有被添加,而沒有它的所有缺陷。 – martineau 2010-12-13 00:01:04

1

我不知道Python 2.7的任何分析器 - 但請查看已添加到sys模塊的以下函數,它可以幫助您自己完成。

「一個新的功能,getsizeof(),需要 Python對象,並返回以字節爲單位 量的對象使用存儲器 ,內置對象返回 正確的結果;第三方 擴展可以不是,但可以定義一個返回對象大小的方法。「

下面是與信息的鏈接的地方在在線文檔看:

        What’s New in Python 2.6
        27.1. sys module — System-specific parameters and functions

+0

它可以但它不。 'sys.getsizeof'是「一個網羅和一個妄想」。閱讀這個SO問題,尤其是Thomas Wouters的回答:http://stackoverflow.com/questions/2117255 – 2010-12-11 20:44:37

+0

@John Machin:在那種情況下,您如何看待@Noctis Skytower的答案? – martineau 2010-12-12 14:14:25