Python 中l(wèi)ist ,set,dict的大規(guī)模查找效率對(duì)比詳解
很多時(shí)候我們可能要頻繁的進(jìn)行元素的find 或in操作,本人一直天真的以為python的list做了hash,通過(guò)紅黑樹(shù)來(lái)高效查找···直到今天我真正來(lái)測(cè)試它和set,dict的查找效率時(shí),才發(fā)現(xiàn)自已想太多了!?。?!
先看代碼:
__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種數(shù)據(jù)結(jié)構(gòu)供查找,常規(guī)的list,集合sl,字典dl.里面的元素都是隨機(jī)生成的,為什么要隨機(jī)生成元素?這是防止某些結(jié)構(gòu)對(duì)有序數(shù)據(jù)的偏向?qū)е聹y(cè)試效果不客觀。 start=time.clock() for i in range(100000): t=i in sl end=time.clock() print("set:",end-start) #計(jì)算通過(guò)set來(lái)查找的效率 start=time.clock() for i in range(100000): t=i in dl end=time.clock() print("dict:",end-start) #計(jì)算通過(guò)dict的效率 start=time.clock() for i in range(100000): t=i in l end=time.clock() print("list:",end-start) #計(jì)算通過(guò)list的效率
結(jié)果:
set: 0.01762632617301519 dict: 0.021149536796960248 ······ ··· ··
呵呵呵呵···list等了20分鐘都沒(méi)出結(jié)果。
所以···結(jié)果一覽無(wú)余啊。
查找效率:set>dict>list
單次查詢中:看來(lái)list 就是O(n)的;而set做了去重,本質(zhì)應(yīng)該一顆紅黑樹(shù)(猜測(cè),STL就是紅黑樹(shù)),復(fù)雜度O(logn);dict類(lèi)似對(duì)key進(jìn)行了hash,然后再對(duì)hash生成一個(gè)紅黑樹(shù)進(jìn)行查找,其查找復(fù)雜其實(shí)是O(logn),并不是所謂的O(1)。O(1)只是理想的實(shí)現(xiàn),實(shí)際上很多hash的實(shí)現(xiàn)是進(jìn)行了離散化的。dict比set多了一步hash的過(guò)程,so 它比set慢,不過(guò)差別不大。
so,如果是要頻繁的查找,請(qǐng)使用set吧!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
selenium設(shè)置瀏覽器為headless無(wú)頭模式(Chrome和Firefox)
這篇文章主要介紹了selenium設(shè)置瀏覽器為headless無(wú)頭模式(Chrome和Firefox),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01python自動(dòng)化測(cè)試之異常及日志操作實(shí)例分析
這篇文章主要介紹了python自動(dòng)化測(cè)試之異常及日志操作,結(jié)合實(shí)例形式分析了python自動(dòng)化測(cè)試中的異常捕獲與日志記錄相關(guān)操作技巧,需要的朋友可以參考下2019-11-11Python提取PDF內(nèi)容的方法(文本、圖像、線條等)
這篇文章主要介紹了Python提取PDF內(nèi)容的方法(文本、圖像、線條等),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09Python getattr()函數(shù)使用方法代碼實(shí)例
這篇文章主要介紹了Python getattr()函數(shù)使用方法代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Tensorflow實(shí)現(xiàn)多GPU并行方式
今天小編就為大家分享一篇Tensorflow實(shí)現(xiàn)多GPU并行方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-02-02python使用PyGame實(shí)現(xiàn)打磚塊游戲
打磚塊也是一個(gè)非常經(jīng)典的小游戲,玩法大致如下,用一個(gè)小車(chē)接一個(gè)小球,然后反射小球,使之打在磚塊上,當(dāng)小球碰到磚塊之后,則磚塊被消掉,邏輯十分清晰,本文將給大家介紹了python使用PyGame實(shí)現(xiàn)打磚塊游戲,文中有詳細(xì)的代碼示例供大家參考,需要的朋友可以參考下2023-12-12Python selenium爬取微博數(shù)據(jù)代碼實(shí)例
這篇文章主要介紹了Python selenium爬取微博數(shù)據(jù)代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05