当前位置: 首页 > 面试题库 >

sys.getsizeof的深版本

巴洲
2023-03-14
问题内容

我想计算对象使用的内存。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, collecthtml" target="_blank">ions.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它不是一个好主意,但是我不确定还有其他方法。


问题答案:

我认为Pympler已经打败了您。

从他们的文档中:

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

源代码可以在这里找到。



 类似资料:
  • 问题内容: 我有一个关于python中可变大小的问题,我使用Ctypes是因为我想要一个1字节的数字,但是当我尝试通过python检查它的大小时(通过)它说是80字节,但是当我用ctypes(via )说它只有1个字节,有人可以告诉我有什么区别,为什么会有2个不同的大小?是因为python使用了对象还是包装器?当它发送到c时,它会查看实际尺寸吗? 结果是 问题答案: 如果您想了解详细信息,则应该查

  • 问题内容: 我想检查python中int数据类型的大小: 结果是“ 436”,对我来说这没有意义。无论如何,我想知道我的机器将占用多少字节(2,4,..?)int。 问题答案: 简短的答案 您正在获得 该类 的大小,而不是 该类 实例的大小。调用以获取实例的大小: 如果该大小看起来仍然有些大,请记住Python与in(例如)c有很大不同。在Python中,an是成熟的对象。这意味着有额外的开销。

  • 这个文档是从侯捷网站提供的繁体板简体化过来的。由于排版问题,有些繁体的术语在换行时候没有被替换,所以遇到问题大家可以对照原文比较一下。

  • 问题内容: 众所周知,如果我们有一些对象引用并且此引用具有final字段,则将确保-我们将看到final字段中的所有可访问字段(至少在构造函数完成时) 范例1: 正如我在这种情况下所理解的那样,我们保证该方法总是输出,因为: 1.我列出了class 和map的完整代码是最终的; 2.如果某个线程将看到的引用,而该引用!= null,则我们保证从最终引用值可达到将是实际的。 我也认为 范例2: 在这

  • 本文向大家介绍深入浅析AngularJs模版与v-bind,包括了深入浅析AngularJs模版与v-bind的使用技巧和注意事项,需要的朋友参考一下 简介 v-bind与{{}}都可以对数据进行绑定,但是二者有区别的,v-bind不好,为什么说v-bind不好是因为v-bin做了完全替换的错做,如果你想做字符串的拼接那么v-bind不是很好的选择,下面看例子。 代码段来喽 比如我们有个这样的需求

  • 本文向大家介绍深入浅析Python2.x和3.x版本的主要区别,包括了深入浅析Python2.x和3.x版本的主要区别的使用技巧和注意事项,需要的朋友参考一下 版本说明 Python 3.0在设计的时候没有考虑向较早版本相容 Python 2.6作为一个过渡版本,基本使用了Python 2.x的语法和库,同时考虑了向Python 3.0的迁移,允许使用部分Python 3.0的语法与函数。   除