設定速度がリストより速いという記事を偶然見たので戸惑い、自分で実験しました
実験1:重複データがほとんどない3つのクエリパフォーマンスの比較
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:データの重複を増やした場合の3つのクエリパフォーマンスの比較
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
リストが最も遅く、セットが最も速く、プラグインがまだ比較的大きいことがわかります
この状況の理由は、セットが削除され、操作後にセットがリストを並べ替えるためです。信じられない場合は、試してみてください。
最下層にハッシュがあるため、dictは高速です。この実験では、繰り返される値が多数あり、リストが非常に遅くなることが示されています。
実験3:繰り返し比率データを増やし続けた場合の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
現在のデータはより明白です。結局のところ、セットが重複排除された後、セット内のデータは非常に小さくなります。ハッシュもこの実験でその重要性を示しています。dictとlistデータの数は同じですが、dictの方が高速です。
前述のように、セットの並べ替え、並べ替えの役割により、データクエリの速度をある程度向上させることができます。
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
クエリを実行すると、順序付けられたデータが高速になる可能性がありますが、大きさを決定する必要があります。実験結果は比較的大きくなります。