深版本sys.getsizeof的[复制](Deep version of sys.getsizeo

2019-07-17 23:38发布

这个问题已经在这里有一个答案:

  • 我该如何衡量一个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是不是一个好主意,但我不知道还能做什么。

Answer 1:

我认为Pympler已经殴打你在这一个冲头。

从他们的文档:

>>> from pympler.asizeof import asizeof
>>> obj = [1, 2, (3, 4), 'text']
>>> asizeof(obj)
176

如果你想有一个具体的例子,你可以找到源头asizeof 这里 。



文章来源: Deep version of sys.getsizeof [duplicate]