无意间看到文章说set的速度比list快,很是不解,于是自己做了一下实验
实验1:几乎不带重复的数据时三者查询性能的对比
import time
import numpy as np
##准备数据
mylist=[int(np.random.rand()*10000000) for i in range(10000000)]
myset=set(mylist)
mydic={i:i for i in mylist}
##list
st=time.time()
for i in mylist:
t1=i
print(time.time()-st)
#set
st=time.time()
for j in myset:
t2=j
print(time.time()-st)
#dict
st=time.time()
for m in mydic:
t3=mydic[m]
#print(t3)
print(time.time()-st)
运行结果:
1.7017035484313965
1.8434038162231445
2.733205556869507
我们可以看到,在数据几乎不带重复数值的时候,dict实际上是最慢的
实验2:增加数据重复时三者查询性能的对比
import time
import numpy as np
##准备数据
##np.random.rand()这里比实验1少一个0,以增加重复数据比例,下面的实验同理
mylist=[int(np.random.rand()*1000000) for i in range(10000000)]
myset=set(mylist)
mydic={i:i for i in mylist}
##list
st=time.time()
for i in mylist:
t1=i
print(time.time()-st)
#set
st=time.time()
for j in myset:
t2=j
print(time.time()-st)
#dict
st=time.time()
for m in mydic:
t3=mydic[m]
#print(t3)
print(time.time()-st)
运行结果:
1.7004029750823975
0.2652003765106201
0.5343024730682373
我们可以看到,现在是list最慢,set最快,插件还是比较大
之所以出现这一段情况是,set会进行去除,而且set对list操作后会进行排序哦,不信可以试试
dict 快是因为底层有hash,这个实验说明重复数值多,list会很慢
实验3:继续加大重复比例数据时三者查询性能的对比
import time
import numpy as np
##准备数据
mylist=[int(np.random.rand()*100000) for i in range(10000000)]
myset=set(mylist)
mydic={i:i for i in mylist}
##list
st=time.time()
for i in mylist:
t1=i
print(time.time()-st)
#set
st=time.time()
for j in myset:
t2=j
print(time.time()-st)
#dict
st=time.time()
for m in mydic:
t3=mydic[m]
#print(t3)
print(time.time()-st)
运行结果:
1.7057056427001953
0.031199932098388672
0.04680013656616211
现在的数据就更加明显,毕竟set去重后,set里面的数据会很少,hash在这个实验也体现出来了意义,dict和list数据个数一样,但是dict可快了
前面提到了set进行排序的作用,排序确实可以在一定程度上增加数据查询速度
import time
import numpy as np
ls1=[i for i in range(10000000)]
ls2=[int(np.random.rand()*10000000) for i in range(10000000)]
st=time.time()
for i in ls1:
t1=i
print(time.time()-st)
st=time.time()
for j in ls2:
t2=j
print(time.time()-st)
运行结果:
1.591202974319458
2.0755040645599365
有序的数据是可以在查询的时候变得更快的,只是幅度多少是待定,这个实验结果提供比较大