列表和Python中设置的内存消耗

>>> from sys import getsizeof
>>> a=[i for i in range(1000)]
>>> b={i for i in range(1000)}
>>> getsizeof(a)
9024
>>> getsizeof(b)
32992

我的问题是,为什么集合消耗的内存比列表多得多?列表是有序的,集合不是.是消耗内存的集合的内部结构吗?还是列表包含指针而set不包含指针?也许sys.getsizeof在这里是错误的?我已经看过有关元组,列表和字典的问题,但是找不到列表和集合之间的任何比较.

最佳答案
我认为这是由于列表和集合或字典之间的固有差异,即元素的存储方式.

List只是对原始对象的引用的集合.假设您创建1000个整数,然后创建1000个整数对象,并且列表仅包含对这些对象的引用.

另一方面,集合或字典必须计算这1000个整数的哈希值,并且根据元素数消耗内存.

例如:在set和dict中,默认情况下,最小大小为8(也就是说,如果仅存储3个值,python仍将分配8个元素).调整大小时,存储桶数增加4倍,直到达到50,000个元素,此后大小增加2倍.这提供了以下可能的尺寸,

16,64,256,1024,4096,16384,65536,131072,262144,…

一些例子:

In [26]: a=[i for i in range(60000)]
In [27]: b={i for i in range(60000)}

In [30]: b1={i for i in range(100000)}
In [31]: a1=[i for i in range(100000)]

In [32]: getsizeof(a)
Out[32]: 514568
In [33]: getsizeof(b)
Out[33]: 2097376

In [34]: getsizeof(a1)
Out[34]: 824464
In [35]: getsizeof(b1)
Out[35]: 4194528

答案:
是的,这是集合存储元素的内部结构消耗大量内存的方式.而且,sys.getsizeof仅是正确的;在这里使用它没有错.

有关列表,集合或字典的更多详细参考,请参考this chapter: High Performance Python

转载注明原文:列表和Python中设置的内存消耗 - 代码日志