【发布时间】:2013-08-14 06:39:07
【问题描述】:
我一直在创建巨大的字典(数百万个条目),我注意到如果我使用键顺序创建它们会更快。
我认为它与哈希函数的冲突有关,但有人可以解释为什么会发生这种情况以及它在 python 版本之间是否一致?
这里有一个人为的例子:
import timeit
import random
def get_test_data(num, size):
olist, ulist = [], []
for _ in range(num):
otest = [str(i) for i in range(size)]
utest = list(otest)
random.shuffle(utest)
olist.append(otest)
ulist.append(utest)
return olist, ulist
NUM_TESTS = 20
# Precalculate the test data so we only measure dict creation time
ordered, unordered = get_test_data(NUM_TESTS, 1000000)
def test_ordered():
dict((k, k) for k in ordered.pop())
def test_unordered():
dict((k, k) for k in unordered.pop())
print "unordered: ",
print timeit.timeit("test_unordered()",
setup="from __main__ import test_unordered, test_ordered",
number=NUM_TESTS)
print "ordered: ",
print timeit.timeit("test_ordered()",
setup="from __main__ import test_unordered, test_ordered",
number=NUM_TESTS)
我机器上的输出始终是:
(X)$ python /tmp/test.py
unordered: 8.60760807991
ordered: 5.1214389801
我在 ubuntu 精确 x86_64 中使用 Python 2.7.3
【问题讨论】:
-
可能是相关的,但我们应该看看 dict 的 C 实现
标签: python performance dictionary