我需要检查在python中使用的对象的内存统计信息。
我找到了guppy和pysizer,但它们不支持python2.7。
有没有适用于python2.7的内存分析器?
如果没有,我自己该怎么做呢?
我需要检查在python中使用的对象的内存统计信息。
我找到了guppy和pysizer,但它们不支持python2.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
的初始化移动到函数内部,使用if memo is None: memo = set()
。当然,所有对getsizeof()
的递归调用也需要交换它们的参数。 - martineau__slots__
,单一/多重继承等类的实例处理是一场噩梦。例如,请参见http://code.activestate.com/recipes/546530-size-of-python-objects-revised/,它花费了超过2000 SLOC和多个版本才达到一个未知是否错误的状态。我同意您对“memo”参数的评论。 - John Machinsys.getsizeof()
在未来会有所改进——我实际上从来没有用过它,所以只知道它被添加了,而不知道它所有的缺陷。 - martineau我不知道有没有适用于Python 2.7的分析器,但是请查看已添加到sys
模块中的以下函数,它可以帮助您自己完成。
"一个新的函数
getsizeof()
,接受一个Python对象并返回对象使用的内存量(以字节为单位)。内置对象返回正确的结果;第三方扩展可能不会,但可以定义一个__sizeof__()
方法来返回对象的大小。"
这里是关于它的在线文档链接:
sys.getsizeof
是“一个陷阱和幻觉”。请阅读这个SO问题,特别是Thomas Wouters的答案:https://dev59.com/vXI95IYBdhLWcg3w3h_G - John Machinpympler 0.9是最新支持Python 2.7的版本,详情请参见https://github.com/pympler/pympler/tags或直接使用pip。