就性能而言,这两者有多大区别?
tmp = []
tmp.append(True)
print tmp[0]
和
tmp = {}
tmp[0] = True
print tmp[0]
答案 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)
他们在我的测试中是公平的