在我的 Mac OS X 10.8.5 64 位笔记本电脑上,一个range(11464882)
对象需要:
>>> import sys
>>> sys.getsizeof(range(11464882))
91719128
>>> sys.getsizeof(11464881) # largest number
24
>>> sys.getsizeof(0) # smalest number
24
>>> 91719128 + (24 * 11464882) # bytes
366876296
>>> (91719128 + (24 * 11464882)) / (1024.0 ** 2) # mb
349.88050079345703
所以350兆内存。
在这里,sys.getsizeof()
返回给定 Python 对象的内存占用,不计算包含的值。因此,对于列表,它只是列表结构所需的内存;簿记信息加上 1100 万个 64 位指针。
此外,许多空字典采取:
>>> sys.getsizeof({})
280
>>> 91719128 + 280 * 11464882
3301886088
>>> (91719128 + 280 * 11464882) / (1024.0 ** 2) # mb
3148.923957824707
>>> (91719128 + 280 * 11464882) / (1024.0 ** 3) # gb
3.0751210525631905
3 GB 内存。1100 万乘以 280 字节是很大的空间。
连同其他开销(很可能是垃圾回收周期检测、Python 进程本身和记忆值),这意味着您达到了机器的每进程 4GB 内存限制。
如果您正在运行 32 位二进制文件,则大小会更小,因为您只需要 32 位指针的空间,但您也只能获得 2GB 的可寻址内存来容纳所有对象。