这个问题已经在这里有一个答案:
- 我该如何衡量一个Python对象的内存使用情况? 2个回答
我想计算由对象使用的内存。 sys.getsizeof
是伟大的,但浅(例如,所谓的名单上,也不会包括由列表中的元素所采取的内存)。
我想编写一个通用的“深度”版sys.getsizeof
。 我知道有在“深”的定义有些含糊不清; 我对这个非常幸福的定义,然后copy.deepcopy
。
这是我第一次尝试:
def get_deep_sizeof(x, level=0, processed=None):
if processed is None:
# we're here only if this function is called by client code, not recursively
processed = set()
processed.add(id(x))
mem = sys.getsizeof(x)
if isinstance(x, collections.Iterable) and not isinstance(x, str):
for xx in x:
if id(xx) in processed:
continue
mem += get_deep_sizeof(xx, level+1, processed)
if isinstance(x, dict):
mem += get_deep_sizeof(x[xx], level+1, processed)
return mem
它有两个已知问题和未知问题数目不详的遭遇:
- 我不知道如何捕捉所有的链接对象的方式遍历一个通用容器。 因此,我使用迭代
in
,和硬编码字典的情况下(包括值,而不仅仅是键)。 显然,这不会对其他类,如字典的工作。 - 我不得不硬编码的排斥
str
(这是一个迭代,然而没有链接到任何其他对象)。 同样,如果有更喜欢的对象,这将打破。
我怀疑使用in
是不是一个好主意,但我不知道还能做什么。