在 python 3.4 中,我试图在一个大循环中填充字典以向其分配 30000 * 1000 个 double 。我想预先为字典分配内存,这样我就可以减少每次迭代分配内存所带来的性能开销。
此外,如何检查允许分配给 python 中的字典(和列表)的内存大小限制?例如,如果它只允许 50MB,我会尽量避免溢出。这可能取决于操作系统和其他系统,但我想知道如何最大限度地提高性能。
我可以用
ll = [None] * 1000
为列表分配内存。
字典有类似的方法吗?
d = {None} * 1000 ?
or
d = {None: None} * 1000 ?
谢谢
请您参考如下方法:
预分配列表可确保分配的索引值有效。我认为这就是预分配字典的意思。在那种情况下:
d = dict.fromkeys(range(1000))
或使用您手边的任何其他键序列。如果您想预分配 None 以外的值,您也可以这样做:
d = dict.fromkeys(range(1000), 0)
编辑,因为您已经编辑了您的问题以阐明您打算预分配内存,那么该问题的答案是否定的,您不能预分配内存,这样做也没有用那。使用的大部分内存不是字典本身,而是用作键和值的对象。字典本身以有效恒定时间的方式分配内存(因此它开始时很小,但随后以整体时间有效恒定的方式调整为更大的 block )。
将 3000 万个对象分配给字典将需要大约 120MB 或 240MB 用于字典本身,但单个对象将需要更多,所以除非您的系统中有大量 RAM,否则我认为这将是给您带来问题的字典,而不是字典本身。
如果你启动交互式提示,你会发现运行它只需要几秒钟:
>>> d = dict.fromkeys(range(30000000))
>>> import sys
>>> sys.getsizeof(d)
1610613016
对于仅包含整数键且所有值为 None 的字典,需要 1,610,613,016 字节 (1.5GB)。也存储唯一值,如果它们也只是整数,那么您的大小就会翻倍,但如果它们是字符串或复杂对象,您的内存消耗将会非常高。
