大型python列表的内存需求

Vin*_*ent 5 python memory-management 32bit-64bit

我做的很愚蠢

from itertools import *
rows = combinations(range(0, 1140), 17)
all_rows = []
for row in rows:
    all_rows.append(row)
Run Code Online (Sandbox Code Playgroud)

毫不奇怪我耗尽内存地址空间(32位python 3.1)我的问题是,我如何计算一个大型列表需要多少内存地址空间?在这种情况下,列表大约为2.3X10 ^ 37.我假设python中有一个函数返回我正在寻找的信息,或者实际上是一个较小但相似的列表的大小.那些工具是什么?

Pet*_*sen 11

有一个方便的功能sys.getsizeof()(自Python 2.6以来)有助于此:

>>> import sys
>>> sys.getsizeof(1)  # integer
12
>>> sys.getsizeof([]) # empty list
36
>>> sys.getsizeof(()) # empty tuple
28
>>> sys.getsizeof((1,))  # tuple with one element
32
Run Code Online (Sandbox Code Playgroud)

由此可以看出,每个整数占用12个字节,列表或元组中每个引用的内存为4个字节(在32位机器上)加上开销(分别为36或28个字节).

如果你的结果的长度为17的整数元组,那么17*(12+4)+28每个元组你就有300个字节.结果本身是一个列表,所以36个字节加上每个引用4个.找出列表的长度(称之为N),你需要36+N*(4+300)的总字节数.

编辑:还有一件事可能会对结果产生重大影响.Python根据大多数整数值的需要创建新的整数对象,但对于小的整数对象(根据经验确定为Windows上的Python 2.6.4的范围[-5,256]),它会预先创建它们并重新使用它们.如果您的大部分值小于257,这将显着减少内存消耗.(在Python上257 is not 257+0;-)).