我注意到当使用 sys.getsizeof() 检查列表和字典的大小时,会发生一些有趣的事情。
我有:
a = [1,2,3,4,5]
大小为 56 字节(空列表的大小为 36,因此有意义,因为 20/5 = 4)
但是,在我删除列表中的所有项目后(使用 .remove 或 del),大小仍然是 56。这对我来说很奇怪。尺寸不应该回到36吗?
有什么解释吗?
我注意到当使用 sys.getsizeof() 检查列表和字典的大小时,会发生一些有趣的事情。
我有:
a = [1,2,3,4,5]
大小为 56 字节(空列表的大小为 36,因此有意义,因为 20/5 = 4)
但是,在我删除列表中的所有项目后(使用 .remove 或 del),大小仍然是 56。这对我来说很奇怪。尺寸不应该回到36吗?
有什么解释吗?
该列表不承诺在您删除元素时释放内存。列表被过度分配,这就是它们如何为附加元素摊销 O(1) 性能。
数据结构的时间性能细节:http ://wiki.python.org/moin/TimeComplexity
增加容器的大小可能是一项昂贵的操作,因为它可能需要在内存中移动很多东西。因此,Python 分配的内存几乎总是比列表的当前内容所需的更多,从而允许对列表的任何单独添加都非常有可能在不需要移动内存的情况下执行。出于类似的原因,列表可能不会立即或永远不会释放已删除元素的内存。
但是,如果您使用切片分配一次删除所有元素:
a[:] = []
这似乎重置它。然而,这是一个实现细节。
当您将项目附加到 Python 列表时,如果已为列表分配的内存已满,它将分配给定数量的内存。当您从列表中删除项目时,它会为您下次将项目附加到列表时分配内存。有关示例,请参阅此相关帖子。