這篇文章主要介紹“python中set、dict和dict.keys的性能對比”,在日常操作中,相信很多人在python中set、dict和dict.keys的性能對比問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”python中set、dict和dict.keys的性能對比”的疑惑有所幫助!接下來,請跟著小編一起來學(xué)習(xí)吧!
目前成都創(chuàng)新互聯(lián)已為1000多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)站空間、網(wǎng)站托管運營、企業(yè)網(wǎng)站設(shè)計、鐵西網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
當我們統(tǒng)計文本的詞頻時,通常需要查詢當前詞是否已經(jīng)出現(xiàn)過,如果出現(xiàn)過,那么次數(shù)增1。通常我用dict來保存詞和詞頻。我常用的方式是:
if word not in vocab_dict: vocab_dict[word] = 0 vocab_dict[word] += 1
用了很久覺得速度還行。
后來看到有大神是這么用的:
if word not in vocab_dict.keys(): vocab_dict[word] = 0 vocab_dict[word] += 1
感覺這樣似乎合理一些,因為我要做的本來就是??磜ord是否是vocab_map的key.于是之后都用這種方式。
某天,處理大量文本,且文本屬于開放領(lǐng)域,詞匯量也大,采用第二種方式,速度極慢,這時候,以為是查詢dict本身比較慢,并沒有意識到是vocab_map.keys()的問題。于是,將詞同時存入set,查詢時查set,速度快了很多。
if word not in vocab_set: vocab_dict[word] = 0 vocab_dict[word] += 1
抽取小部分數(shù)據(jù),量化對比set、dict、dict.keys()的查詢速度,結(jié)果如下:
1.查詢vocab_dict,打印語句:
print "time cost is %d ms." % ((end - begin).microseconds/1000) time cost is 175 ms.
2.查詢vocab_dict.keys(),打印語句如下:
print "time cost is %d s." % ((end - begin).seconds) time cost is 45 s.
3.查詢vocab_set,打印語句:
print "time cost is %d ms." % ((end - begin).microseconds/1000) time cost is 168 ms.
和查詢vocab_dict差不多。
那么為什么dict.keys()查詢速度比另外兩個慢很多呢?這就要對比list、dict、set三種的數(shù)據(jù)結(jié)構(gòu)了。
dict.keys()實際上是list(keys),是dict的所有key組成的list。查找一個元素是否在list中是以list的下標為索引遍歷list.而查詢是否在dict中,是將key以hash值的形式直接找到key對應(yīng)的索引,根據(jù)索引可直接訪問value。對量大的dict查詢,自然是后者快很多。
而set和dict的存儲原理基本是一樣的,唯一不同的是,set沒有value,只有key。對查詢key是否在dict或sset內(nèi),效果基本上是一樣的。
由此,可以得出,如果存儲的數(shù)據(jù)會被反復(fù)查詢,且量大,那么,盡量不要用list,盡量用dict,如果元素不重復(fù),用set更好。查詢是否在dict內(nèi),也不要在用dict.keys()。
到此,關(guān)于“python中set、dict和dict.keys的性能對比”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>
當前文章:python中set、dict和dict.keys的性能對比
地址分享:http://weahome.cn/article/pjeiod.html