有一个疑惑,字典作为哈希表,从时间复杂度的角度上来说,获取要比遍历速度快的多,但是用 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 May 7, 2018
你 mydict 里面的数据是不是 1-99999 顺序存的?
|
2
ipwx May 7, 2018
。。。你字典多大?
|
3
am241 May 7, 2018 via Android
99999 是不是在 keys 的前部?
|
4
kevindu May 7, 2018
可能迭代和查找的实现是一样的吧,都是 lookdict
|
5
hmzt May 7, 2018
不该把字典所有值查一遍看总时间么
|
6
sampeng May 7, 2018
推测字典就一个 99999.。。
|
7
kevindu May 7, 2018 %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 May 8, 2018
lz 想搞一个大新闻
|
14
RicardoScofileld OP @kevindu 对了,if ... in 本质也是遍历操作,时间复杂度也是 O(n),我把 travel 改拨了一下,if 9999 in a.keys(),测试了一下,差别还是很小
|
15
yujieyu7 May 8, 2018
遍历要比获取快???手动黑人问号脸
|
16
mayorbryant May 9, 2018
@RicardoScofileld 字典可以直接判断,不需要 a.keys(), 如果 if 9999 in a.keys() 这是一个列表的 in 判断,应该是 if 9999 in a
|
17
a132811 May 10, 2018
7 楼正解
@RicardoScofileld 问题的方向错啦 |