我有以下脚本来测试哪个更快
1.按列表中的索引获取元素,或
2.在字典中按键获取元素
import timeit
import random
lis1 = [random.randint(1,10000) for x in xrange(0,10001)]
dict1 = {x:random.randint(1,10000) for x in xrange(0,10001)}
def list_lookup():
index = random.randint(0,10000)
x = lis1[index]
def dict_lookup():
index = random.randint(0,10000)
x = dict1[index]
def main():
print timeit.repeat("list_lookup()", "from __main__ import list_lookup",number=1000000)
print timeit.repeat("dict_lookup()", "from __main__ import dict_lookup",number=1000000)
if __name__ == '__main__':
main()
它提供以下输出
[1.208083152770996, 1.1942389011383057, 1.1882140636444092]
[1.2461788654327393, 1.2427518367767334, 1.2414629459381104]
虽然差异似乎可以忽略不计,但似乎字典查找需要稍长的时间
是因为字典中的获取元素涉及两个步骤 - 首先散列键然后获取值(第二个),而在列表中我们只是从列表的特定位置的内存地址中获取值
答案 0 :(得分:2)
实际上有三个步骤,它还需要比较(==
)它找到的密钥和给定的密钥,以确保它返回正确的值,而不是碰巧映射到同一个桶的另一个值
最重要的是,低效的散列/冲突会导致进一步的缓慢(因此,dict查找是O(N)最坏的情况)。
答案 1 :(得分:0)
列表中的查找是O(n),字典中的查找是分摊的O(1),关于数据结构中的项目数。
有关详情,请参阅此回答Here