我需要檢查我在python中使用的對象的內存統計信息。
我遇到了guppy和pysizer,但它們不適用於python2.7。
是否有可用於python 2.7的內存分析器?
如果不是,我可以自己做嗎?是否有python2.7的內存分析器?
回答
你可能想嘗試下面的代碼適應您的具體情況並支持您的數據類型:
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())
看起來很有前途,但我認爲你應該把它改成'def getsizeof(obj,memo = None):'並且把'memo'的初始化移動到函數中,如果備忘錄是None:memo = set()'。當然,所有對'getsizeof()'的遞歸調用都需要自己的參數交換。 – martineau 2010-12-12 14:12:59
@馬蒂諾:一個不應該隨便扔在新手道路上的承諾。通過舊/新的複雜性來處理類的實例,有/無'__slots__',沒有/單/多重繼承等是一場噩夢。例如參見http://code.activestate.com/recipes/546530-size-of-python-objects-revised/,它花費了超過2000個SLOC和多個版本,以使其成爲未知的錯誤州。我同意你對「備忘錄」的評論。 – 2010-12-12 20:34:53
@John Machin:現在的狀態配方現在更接近3000行源代碼,並且是5.12版本,所以一般情況下顯然是一個很難破解的蛋 - 這是我發現@Noctis Skytower的答案很有趣的原因之一,因爲經常有一個並不需要一種能夠處理所有可能的案例的工具,只有他們自己的一小部分。希望'系統。getsizeof()'將在未來得到改善 - 我從來沒有真正需要它,所以只知道它沒有被添加,而沒有它的所有缺陷。 – martineau 2010-12-13 00:01:04
我不知道Python 2.7的任何分析器 - 但請查看已添加到sys
模塊的以下函數,它可以幫助您自己完成。
「一個新的功能,
getsizeof()
,需要 Python對象,並返回以字節爲單位 量的對象使用存儲器 ,內置對象返回 正確的結果;第三方 擴展可以不是,但可以定義一個返回對象大小的方法。「
下面是與信息的鏈接的地方在在線文檔看:
What’s New in Python 2.6
27.1. sys module — System-specific parameters and functions
它可以但它不。 'sys.getsizeof'是「一個網羅和一個妄想」。閱讀這個SO問題,尤其是Thomas Wouters的回答:http://stackoverflow.com/questions/2117255 – 2010-12-11 20:44:37
@John Machin:在那種情況下,您如何看待@Noctis Skytower的答案? – martineau 2010-12-12 14:14:25
下面是一個適用於Python 2.7的工具:The Pympler package。
- 1. 是否有內存使用情況分析器可用?
- 2. 是否有Go分析器?
- 3. silverlight的內存分析器
- 4. 是否有.NET 4.0的CLR分析器?
- 5. eclipse內存分析器沒有打開
- 6. 內存的kfree部分是否有效?
- 7. Android ==>內存分析==> Eclipse內存分析器?
- 8. Javascript內存分析器
- 9. 內存分析器for ironpython
- 10. broid中是否有P2P分析器
- 11. 是否有分析DTD
- 12. iPhone:存在內存泄漏分析器?
- 13. 是否有一個.Net內存分析器將跟蹤大對象堆上的所有分配?
- 14. Android內存分配器 - 內存是否需要連續?
- 15. python2.7內存限制版本
- 16. 是否有類似於Java/.Net分析器的SQL Server分析器?
- 17. 用於Firefox的Javascript內存分析器
- 18. 內存泄漏 - 調試器和內存分析器不同意
- 19. Android內存分析
- 20. 堆內存分析
- 21. 分配內存分析器和任務管理器之間的內存差異
- 22. 是否可以解析ColdFusion 9.0.1緩存內存的內容?
- 23. 「分析器圖」中的「非託管內存」。這是內存泄漏指示嗎?
- 24. 識別python中的內存泄漏 - 內存分析器
- 25. Eclipse內存分析器解釋
- 26. 使用儀器進行內存分析
- 27. Python內存分析器繪圖
- 28. Eclipse內存分析器:java.lang.OutOfMemoryError:Java堆空間
- 29. php是否有內存?
- 30. 是否有log4net內存appender?
你真的*需要分析你的代碼嗎?只是問問! – user225312 2010-12-11 12:41:33
「檢查對象的內存統計信息」爲什麼?你有什麼具體的問題?內存不足?分析通常不是必需的,通常很明顯*哪個對象太大。請解釋您實際觀察到的問題。 – 2010-12-11 14:19:31
[Python內存分析器]的可能重複(http://stackoverflow.com/questions/110259/python-memory-profiler) – 2010-12-11 15:25:18