Python 中list ,set,dict的大規模查詢效率
阿新 • • 發佈:2019-02-08
很多時候我們可能要頻繁的進行元素的find 或in操作,本人一直天真的以為python的list做了hash,通過紅黑樹來高效查詢···直到今天我真正來測試它和set,dict的查詢效率時,才發現自已想太多了!!!!
先看程式碼:
__author__ = 'jmh081701'
import numpy
import time
l=[]
sl=set()
dl=dict()
r=numpy.random.randint(0,10000000,100000)
for i in range(0,100000):
l.append(r[i])
sl.add(r[i])
dl.setdefault(r[i],1 )
#生成3種資料結構供查詢,常規的list,集合sl,字典dl.裡面的元素都是隨機生成的,為什麼要隨機生成元素?這是防止某些結構對有序資料的偏向導致測試效果不客觀。
start=time.clock()
for i in range(100000):
t=i in sl
end=time.clock()
print("set:",end-start)
#計算通過set來查詢的效率
start=time.clock()
for i in range(100000):
t=i in dl
end=time.clock()
print("dict:",end-start)
#計算通過dict的效率
start=time .clock()
for i in range(100000):
t=i in l
end=time.clock()
print("list:",end-start)
#計算通過list的效率
結果:
set: 0.01762632617301519
dict: 0.021149536796960248
······
···
··
呵呵呵呵···list等了20分鐘都沒出結果。
所以···結果一覽無餘啊。
查詢效率:set>dict>list
單次查詢中:看來list 就是O(n)的;而set做了去重,本質應該一顆紅黑樹(猜測,STL就是紅黑樹),複雜度O(logn);dict類似對key進行了hash,然後再對hash生成一個紅黑樹進行查詢,其查詢複雜其實是O(logn),並不是所謂的O(1)。O(1)只是理想的實現,實際上很多hash的實現是進行了離散化的。dict比set多了一步hash的過程,so 它比set慢,不過差別不大。
so,如果是要頻繁的查詢,請使用set吧!