如何在Python中设置字典的初始大小?

时间:2009-08-19 09:06:30

标签: python performance dictionary

我将大约400万个不同的密钥放入Python字典中。 创建此字典大约需要15分钟,并且在我的计算机上占用大约4GB的内存。完全创建字典后,查询字典很快。

我怀疑字典创建是如此耗费资源,因为字典经常被重新定义(因为它大大增加)。 是否可以在Python中创建一个具有一些初始大小或桶号的字典?

我的字典从数字指向对象。

class MyObject(object):
  def __init__(self):
    # some fields...

d = {}
d[i] = MyObject()  # 4M times on different key...

6 个答案:

答案 0 :(得分:30)

对于性能问题,最好进行衡量。以下是一些时间安排:

 d = {}
 for i in xrange(4000000):
     d[i] = None
 # 722ms

 d = dict(itertools.izip(xrange(4000000), itertools.repeat(None)))
 # 634ms

 dict.fromkeys(xrange(4000000))
 # 558ms

 s = set(xrange(4000000))
 dict.fromkeys(s)
 # Not including set construction 353ms

最后一个选项不进行任何调整大小,它只是从集合中复制哈希值并递增引用。正如您所看到的,调整大小并不需要花费很多时间。可能你的对象创建很慢。

答案 1 :(得分:9)

我试过了:

a = dict.fromkeys((range(4000000)))

它在大约3秒内创建一个包含4 000 000个条目的字典。之后,设置值非常快。所以我猜dict.fromkey肯定是要走的路。

答案 2 :(得分:6)

如果您了解C,则可以查看dictobject.cthe Notes on Optimizing Dictionaries。你会注意到参数PyDict_MINSIZE:

  

PyDict_MINSIZE。目前设为8。

此参数在dictobject.h中定义。所以你可以在编译Python时改变它,但这可能是一个坏主意。

答案 3 :(得分:4)

您可以尝试使用dict.fromkeys classmethod将内容填充与内容填充分开。它会创建一个已知大小的dict,其中所有值都默认为None或您选择的值。之后,您可以迭代它以填充值。它可以帮助您计算所有键的实际散列时间。不确定你是否能够显着提高速度。

答案 4 :(得分:2)

如果您的数据需要/可以存储在光盘上,也许您可​​以将数据存储在BSDDB database或使用Cpickle加载/存储您的字典

答案 5 :(得分:1)

您是否使用相同类型的新“空”实例初始化所有键?是否无法编写defaultdict或在访问对象时创建对象的东西?