Python - 嵌套空列表的内存大小

标签 python python-3.x in-memory empty-list

可以使用 sys.getsizeof 获取对象在内存中的大小。

正如人们所料,[] 的大小小于 [[]] 的大小。在我的机器上,我得到以下尺寸:

>>> sys.getsizeof([])
36
>>> sys.getsizeof([[]])
40

现在,无论我有多少嵌套空列表,我总是得到相同的大小:

>>> sys.getsizeof([[[]]])
40
>>> sys.getsizeof([[[[]]]])
40

嵌套空列表的大小似乎有上限是什么原因?

最佳答案

大小仅指最外层的对象而不是嵌套的对象。从 getsizeof 的角度来看,对象大小就是对象的大小加上对象中包含的指针的大小,而不是被指向的对象。从以下几点可以看出:

>>> import sys
>>> sys.getsizeof([])
64
>>> sys.getsizeof([[]])
72
>>> sys.getsizeof([[[]]])
72
>>> sys.getsizeof([[],[]])
80
>>> sys.getsizeof([[[]],[[]]])
80

如果您想获得总内存占用量,您将需要递归地查找对象的大小或使用其他一些内存分析。

此外,如果您正在编写自己的对象并希望 getsizeof 正确返回大小,您可以实现自己的 __sizeof__ 方法。例如:

import sys
class mylist:
    def __init__(self, iterable):
        self.data = list(iterable)

    def __sizeof__(self):
        return object.__sizeof__(self) + \
            sum(sys.getsizeof(v) for v in self.__dict__.values()) + \
            sum(sys.getsizeof(item) for item in self.data)

original_data = [[1,2,3], [1,2,3]]
print(sys.getsizeof(original_data))
foo = mylist(original_data)
print(sys.getsizeof(foo))

结果:

~/code_snippets$ python3 sizeof_list.py 
80
336

关于Python - 嵌套空列表的内存大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41318803/

相关文章:

security - Symfony2 in_memory 用户提供程序问题

python - PyAudio安装问题

python - 如何在 Django 中进行表单验证

python - 建立没有循环的矩阵?

python - __lt__ 实际为列表做了什么

python - 为 python 3 urllib 打开调试输出

unit-testing - 有没有一个像 DB2 一样好的内存数据库

python - win32剪贴板不存在?

python-3.x - 当云函数下载某些内容时,对象存储在哪里?

c - 在内存中压缩数据膨胀