考虑到 Nolen Royalty 的添加,我想我会注意您实际上可以以稍微更好的方式进行 timeit 测试。通过将dict 的构造移到设置函数中,我们可以只对dict 上的操作进行计时,从而得到一个可以轻松比较的结果。
在 3.2 中:
python -m timeit -s 'd = {(str(i), str(j)):"a" for i in range(100) for j in range(1000)}' '_ = ("1", "2") in d.keys()' '_ = (1, 2) in d.keys()'
1000000 loops, best of 3: 0.404 usec per loop
python -m timeit -s 'd = {(str(i), str(j)):"a" for i in range(100) for j in range(1000)}' '_ = ("1", "2") in d' '_ = (1, 2) in d'
1000000 loops, best of 3: 0.247 usec per loop
您可以看到差异。在 3.x 中,直接在 dict 上工作可以使我们的速度提高近 2 倍,这还不错。
在 2.7.3 中:
python2 -m timeit -s 'd = {(str(i), str(j)):"a" for i in range(100) for j in range(1000)}' '_ = ("1", "2") in d.keys(); _ = (1, 2) in d.keys()'
10 loops, best of 3: 36.3 msec per loop
python2 -m timeit -s 'd = {(str(i), str(j)):"a" for i in range(100) for j in range(1000)}' '_ = ("1", "2") in d' '_ = (1, 2) in d'
10000000 loops, best of 3: 0.197 usec per loop
在 2.x 中,差异确实惊人。使用 dict.keys() 需要 36,300 微秒,而仅使用 dict 需要不到 0.2 微秒。这快了将近 20 万 倍。
只是觉得这值得一提。
编辑:
Tim 做了一个有趣的评论,所以我决定做另一个测试。我尝试只构建列表,然后只进行哈希查找,结果如下:
python2 -m timeit -s 'd = {(str(i), str(j)):"a" for i in range(100) for j in range(1000)}' 'd.keys()' 'd.keys()'
100 loops, best of 3: 5.84 msec per loop
python2 -m timeit -s 'd = {(str(i), str(j)):"a" for i in range(100) for j in range(1000)}' -s 'l=d.keys()' '_ = ("1", "2") in l' '_ = ("1", "2") in l'
10 loops, best of 3: 25.3 msec per loop
您可以看到,在这样的大字典上,构建列表大约需要 1/6 的时间,而在列表中搜索则需要 5/6 的时间。