有一个疑惑,字典作为哈希表,从时间复杂度的角度上来说,获取要比遍历速度快的多,但是用 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)
1 chisoco 2018-05-07 10:28:48 +08:00 你 mydict 里面的数据是不是 1-99999 顺序存的? |
![]() | 2 ipwx 2018-05-07 10:35:39 +08:00 。。。你字典多大? |
3 am241 2018-05-07 11:20:25 +08:00 via Android 99999 是不是在 keys 的前部? |
4 kevindu 2018-05-07 13:46:16 +08:00 可能迭代和查找的实现是一样的吧,都是 lookdict |
![]() | 5 hmzt 2018-05-07 14:10:24 +08:00 不该把字典所有值查一遍看总时间么 |
6 sampeng 2018-05-07 16:39:40 +08:00 推测字典就一个 99999.。。 |
7 kevindu 2018-05-07 16:57:07 +08:00 ![]() %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) |
![]() | 8 RicardoScofileld OP @chisoco 直接写了个字典推导式 {x:x for x in range(10000)} |
![]() | 9 RicardoScofileld OP @ipwx {0:0,.......,99999:99999} |
![]() | 10 RicardoScofileld OP @hmzt 已经遍历字典的 key 了呀 |
![]() | 11 RicardoScofileld OP @am241 out 了一下 dict.keys(),列表是从 0 到 99999 的 |
![]() | 12 RicardoScofileld OP @kevindu 多谢,我说嘛,这不合理啊 |
![]() | 13 aijam 2018-05-08 04:45:31 +08:00 lz 想搞一个大新闻 |
![]() | 14 RicardoScofileld OP @kevindu 对了,if ... in 本质也是遍历操作,时间复杂度也是 O(n),我把 travel 改拨了一下,if 9999 in a.keys(),测试了一下,差别还是很小 |
15 yujieyu7 2018-05-08 12:08:11 +08:00 遍历要比获取快???手动黑人问号脸 |
![]() | 16 mayorbryant 2018-05-09 10:40:10 +08:00 @RicardoScofileld 字典可以直接判断,不需要 a.keys(), 如果 if 9999 in a.keys() 这是一个列表的 in 判断,应该是 if 9999 in a |
17 a132811 2018-05-10 17:26:02 +08:00 7 楼正解 @RicardoScofileld 问题的方向错啦 |