通过列表中的索引获取元素比在字典中按键获取元素更快

时间:2015-03-03 06:01:38

标签: python list dictionary

我有以下脚本来测试哪个更快

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]

虽然差异似乎可以忽略不计,但似乎字典查找需要稍长的时间

是因为字典中的获取元素涉及两个步骤 - 首先散列键然后获取值(第二个),而在列表中我们只是从列表的特定位置的内存地址中获取值

2 个答案:

答案 0 :(得分:2)

实际上有三个步骤,它还需要比较(==)它找到的密钥和给定的密钥,以确保它返回正确的值,而不是碰巧映射到同一个桶的另一个值

最重要的是,低效的散列/冲突会导致进一步的缓慢(因此,dict查找是O(N)最坏的情况)。

答案 1 :(得分:0)

列表中的查找是O(n),字典中的查找是分摊的O(1),关于数据结构中的项目数。

有关详情,请参阅此回答Here