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;-)).