我将大约400万个不同的密钥放入Python字典中。 创建此字典大约需要15分钟,并且在我的计算机上占用大约4GB的内存。完全创建字典后,查询字典很快。
我怀疑字典创建是如此耗费资源,因为字典经常被重新定义(因为它大大增加)。 是否可以在Python中创建一个具有一些初始大小或桶号的字典?
我的字典从数字指向对象。
class MyObject(object):
def __init__(self):
# some fields...
d = {}
d[i] = MyObject() # 4M times on different key...
答案 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.c和the 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或在访问对象时创建对象的东西?