我试图制作一个列表,其中2个元素增加到30个,但是我遇到了内存错误.为什么这样?它是否在python中列表的最大限制之外?
m=[None]*(2**30)
Run Code Online (Sandbox Code Playgroud)
是的,Python列表可以容纳多少元素是有限制的,请参阅sys.maxsize.但是你没有击中它; 很少有机器有足够的内存来容纳那么多项目.
您正在尝试创建一个包含1073741824个引用的列表; 每个参考也需要记忆.这取决于你的操作系统多少,但通常对于32位系统来说是4个字节,对于64位操作系统来说是8个字节,其中2 ^ 30个元素需要4 GB或8GB内存,仅用于列表参考.
4GB以及其他元素已经比大多数当前操作系统允许单个进程在内存中使用的内容容易得多.
在我的Mac OS X机器上(使用64位操作系统),sys.maxsize是2 ^ 63,列表中的Python对象引用占用8个字节:
>>> import sys
>>> sys.maxsize
9223372036854775807
>>> sys.maxsize.bit_length()
63
>>> sys.getsizeof([]) # empty list overhead
72
>>> sys.getsizeof([None]) - sys.getsizeof([]) # size of one reference
8
Run Code Online (Sandbox Code Playgroud)
因此,要创建一个包含sys.maxsize元素的列表,您需要64个exbibytes内存,仅供参考.这不仅仅是64位计算机可以解决的问题(实际最大值大约是16个exbibytes).
所有这些都忽略了您在列表中引用的对象所占用的内存占用量.None是单身,所以它只会占用一定量的内存.但据推测,你打算在该列表中存储其他东西,在这种情况下你也需要考虑到这一点.
一般来说,你永远不需要创建这么大的列表.使用不同的技术; 例如,使用字典创建稀疏结构,我怀疑您是否计划直接在算法中处理所有这些2 ^ 30索引.