为字典预先分配内存?

时间:2016-11-29 14:45:28

标签: python python-3.x dictionary

在python 3.4中,我试图在一个大循环中填充一个字典,为它分配30000 * 1000个双数。我想事先为字典分配内存,这样我就可以减少每次迭代中分配内存所带来的性能开销。

另外,如何检查允许在python中分配给字典(和列表)的内存大小限制?例如,如果它只允许50MB,我会尽量避免溢出。这可能取决于操作系统和其他系统,但我想知道如何最大限度地提高性能。

我可以用

ll = [None] * 1000

为列表分配内存。

字典有类似的方法吗?

d = {None} * 1000 ? 
or 
d = {None: None} * 1000 ? 

感谢

4 个答案:

答案 0 :(得分:2)

这里的问题是你应该知道钥匙。例如,您可以这样做:

d = {i: None for i in range(1000)}

但如果您知道密钥为0 ... 999,则只能这样做。

答案 1 :(得分:2)

您可能不需要

您不需要为python对象“分配内存”。 您可以使用.append动态扩展列表。

如果您知道将放入列表的数据类型,则预分配内存是有意义的,在这种情况下,我会看到numpy。

对于字典:

如果您知道密钥,可以使用dictionary = {a:None for a in range (100)}, 但你最好使用collections.defaultdict

答案 2 :(得分:2)

预分配列表可确保分配的索引值有效。我认为通过预先分配字典意味着你的意思。在那种情况下:

d = dict.fromkeys(range(1000))

或使用您方便的任何其他按键序列。如果您想预先分配除None之外的值,您也可以这样做:

d = dict.fromkeys(range(1000), 0)

编辑,因为您已经编辑过您的问题以澄清您打算预先分配内存,那么问题的答案是否定的,您无法预先分配内存,也不会有用要做到这一点。使用的大多数内存不是字典本身,它将是用作键和值的对象。字典本身以一种有效恒定时间的方式分配内存(因此它从小开始,然后以更大的块调整大小以使整个时间有效地保持不变)。

将一千万个对象分配到字典中需要大约120MB或240MB的dict本身,但是单个对象需要更多,所以除非你的系统中有很多RAM,否则我认为它将是字典,它给你一个问题,而不是字典本身。

如果启动交互式提示,您会发现只需几秒钟即可运行:

>>> d = dict.fromkeys(range(30000000))
>>> import sys
>>> sys.getsizeof(d)
1610613016

对于仅包含整数键且所有值均为None的字典,为1,610,613,016字节(1.5GB)。存储唯一值也是如此,如果它们只是整数,则你的大小加倍,但如果它们是字符串或复杂对象,那么你的内存消耗将非常高。

答案 3 :(得分:0)

直接问题似乎是:为*操作数定义了dict吗?答案是否定的。

>>> {None:None} * 3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for *: 'dict' and 'int'

您可以使用

创建一个包含给定数量键的字典
d = dict((i,None) for i in range(1000))

或更多地用于Python 2.7或3.x

d = {i: None for i in range(1000)}

这将创建一个包含1000个唯一整数键的字典(除此之外,它在语义上等同于原始列表示例)。