如何在Python中设置字典的初始大小?
我正在把大约400万个不同的键放进一个Python字典里。创建这个字典大约需要15分钟,并且在我的电脑上消耗了大约4GB的内存。等字典完全创建好后,查询这个字典的速度很快。
我怀疑字典创建时消耗这么多资源是因为字典在不断增长时经常需要重新调整大小(也就是重新哈希)。有没有办法在Python中创建一个字典时指定一个初始大小或者桶的数量呢?
我的字典是从一个数字指向一个对象。
class MyObject:
def __init__(self):
# some fields...
d = {}
d[i] = MyObject() # 4M times on different key...
5 个回答
8
如果你了解C语言,可以看看这个链接:dictobject.c 和 关于优化字典的笔记。在这里你会看到一个参数叫做 PyDict_MINSIZE:
PyDict_MINSIZE。目前设置为8。
这个参数是在 dictobject.h 文件中定义的。所以你可以在编译Python的时候去修改它,但这样做可能不是个好主意。
11
我试了一下:
a = dict.fromkeys((range(4000000)))
它大约在3秒钟内创建了一个有400万条记录的字典。之后,设置值的速度非常快。所以我觉得用dict.fromkey这个方法绝对是个好选择。
44
在处理性能问题时,最好的办法就是进行测量。这里有一些时间记录:
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
最后一种选择不进行任何调整大小的操作,它只是从集合中复制哈希值并增加引用计数。正如你所看到的,调整大小并没有花费很多时间。可能是你创建对象的过程比较慢。