Python中关于字典遍历的问题

有一个疑惑,字典作为哈希表,从时间复杂度的角度上来说,获取要比遍历速度快的多,但是用 ipython 测试了一下,发现遍历要比获取快是什么原因啊

 def travel():
     for  key in mydict.keys():
        if 99999 == key:
             return True
 def get():
      if mydict.get(99999):
           return True

%timeit travel 83.2 ns ± 2.49 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)

%timeit get 87 ns ± 0.485 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)


Python中关于字典遍历的问题

18 回复

你 mydict 里面的数据是不是 1-99999 顺序存的?


在Python里遍历字典有几种常用方法,看你要键、值还是键值对。

遍历键:

my_dict = {'a': 1, 'b': 2, 'c': 3}
for key in my_dict:
    print(key)
# 或者
for key in my_dict.keys():
    print(key)

遍历值:

for value in my_dict.values():
    print(value)

遍历键值对:

for key, value in my_dict.items():
    print(f'{key}: {value}')

注意点:

  • 遍历时不要修改字典大小(增删键),否则会报错
  • items()获取键值对最方便
  • Python 3.6+ 字典保持插入顺序

一句话建议: 根据需求选对遍历方法。

。。。你字典多大?

99999 是不是在 keys 的前部?

可能迭代和查找的实现是一样的吧,都是 lookdict

不该把字典所有值查一遍看总时间么

推测字典就一个 99999.。。

%timeit travel()
%timeit get()

才是正确的打开方式。。。

11.6 ms ± 48.5 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
188 ns ± 5.74 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

直接写了个字典推导式 {x:x for x in range(10000)}

{0:0,…,99999:99999}

已经遍历字典的 key 了呀

out 了一下 dict.keys(),列表是从 0 到 99999 的

多谢,我说嘛,这不合理啊

lz 想搞一个大新闻

对了,if … in 本质也是遍历操作,时间复杂度也是 O(n),我把 travel 改拨了一下,if 9999 in a.keys(),测试了一下,差别还是很小

遍历要比获取快???手动黑人问号脸

字典可以直接判断,不需要 a.keys(), 如果 if 9999 in a.keys() 这是一个列表的 in 判断,应该是 if 9999 in a

7 楼正解
问题的方向错啦

回到顶部