Python中的列表或字典是否更快?

时间:2009-06-03 03:14:40

标签: python data-structures

就性能而言,这两者有多大区别?

tmp = []
tmp.append(True)
print tmp[0]

tmp = {}
tmp[0] = True
print tmp[0]

4 个答案:

答案 0 :(得分:24)

标准库中的timeit模块仅用于回答这些问题!忘记print(这会给你的终端喷出令人讨厌的副作用;-)并比较:

$ python -mtimeit 'tmp=[]; tmp.append(True); x=tmp[0]'
1000000 loops, best of 3: 0.716 usec per loop
$ python -mtimeit 'tmp={}; tmp[0]=True; x=tmp[0]'
1000000 loops, best of 3: 0.515 usec per loop

所以,dict是赢家 - 0.2微秒......! - )

答案 1 :(得分:6)

微观优化通常不仅无意义,我发现对于Python来说尤其困难和晦涩难懂。实际上,使代码同时变得更慢,更复杂是非常容易的。有关最简单,最简洁,最短的Python解决方案也是最快的示例,请参阅this Stack Overflow question

正如其他人通过实际测试所表明的那样,两种选择之间的速度差异非常小。不那么小的是语义差异。列表和词典不仅仅是相同概念的两种实现,而是用于不同的用途。选择最适合您使用的那个。

答案 2 :(得分:0)

结论是 dict 是赢家的答案是错误的。

列表比字典快(但不多)。

将项目添加到 dicts 所需的时间是列表的 1.5 倍。

从字典中查找值所需的时间是从列表中查找值的 1.3 倍。

应该将增加列表/字典的性能与从列表/字典中查找项目的性能分开。

更重要的是,存在的元素数量可能会影响添加新元素的效率,尤其是对于字典。

因此,最好让 list/dict 增长到大量元素,然后测量所有这些元素的查找。

像这样

from timeit import timeit
tmpList = []
tmpDict = {}
timeListAdd = timeit("""
for i in range(1000000):
    tmpList.append(True)
""", globals=locals(), number=1)
print(timeListAdd)

0.08886219099999959

timeDictAdd = timeit("""
for i in range(1000000):
    tmpDict[i]= True
""", globals=locals(), number=1)
print(timeDictAdd)

0.1336365199999996

timeListAccess = timeit("""
for i in range(1000000):
    tmpList[i]
""", globals=locals(), number=1)
print(timeListAccess)

0.06501517400000001

timeDictAccess = timeit("""
for i in range(1000000):
    tmpDict[i]
""", globals=locals(), number=1)
print(timeDictAccess)

0.08099801200000023

顺便说一句,如果您在创建时了解所有元素,还有更好的方法来创建这些结构:

timeListCreate = timeit("""tmpList = [True for i in range(1000000)]""", globals=locals(), number=1)
print(timeListCreate)

0.03953780500000903

timeDictCreate = timeit("""tmpDict = {i: True for i in range(1000000)}""", globals=locals(), number=1)
print(timeDictCreate)

0.0972781530000475

答案 3 :(得分:-2)

他们在我的测试中是公平的