我需要檢查我在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. NetBeans是否具有eclipse內存分析器工具的模擬?
- 2. Python3中是否有任何工作內存分析器
- 3. 是否有內存使用情況分析器可用?
- 4. 是否有Go分析器?
- 5. 內存分析器
- 6. silverlight的內存分析器
- 7. 是否有用於分析yourkit快照(內存/ CPU)的API?
- 8. 是否有addr2line分析內存中的代碼?
- 9. 是否有.NET 4.0的CLR分析器?
- 10. eclipse內存分析器沒有打開
- 11. 內存的kfree部分是否有效?
- 12. ANTS內存分析器 - 分析器是否可以連接到內置版本的服務?
- 13. Android ==>內存分析==> Eclipse內存分析器?
- 14. 內存分析器for ironpython
- 15. Windows Phone內存分析器
- 16. Javascript內存分析器
- 17. broid中是否有P2P分析器
- 18. 是否有多線程內存分配器的驗證套件?
- 19. 內存分析
- 20. 是否有分析DTD
- 21. iPhone:存在內存泄漏分析器?
- 22. 是否有一個.Net內存分析器將跟蹤大對象堆上的所有分配?
- 23. Android內存分配器 - 內存是否需要連續?
- 24. python2.7內存限制版本
- 25. 是否有類似於Java/.Net分析器的SQL Server分析器?
- 26. 用於Firefox的Javascript內存分析器
- 27. 是否正在分配多餘的內存,是否存在內存泄漏?
- 28. 內存泄漏 - 調試器和內存分析器不同意
- 29. 是否有任何良好的Windows Mobile 6.0內存分析工具?
- 30. 堆內存分析
你真的*需要分析你的代碼嗎?只是問問! – 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