溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python中set、dict和dict.keys的性能對(duì)比

發(fā)布時(shí)間:2021-09-04 16:38:14 來(lái)源:億速云 閱讀:126 作者:chen 欄目:大數(shù)據(jù)

這篇文章主要介紹“python中set、dict和dict.keys的性能對(duì)比”,在日常操作中,相信很多人在python中set、dict和dict.keys的性能對(duì)比問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”python中set、dict和dict.keys的性能對(duì)比”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

 當(dāng)我們統(tǒng)計(jì)文本的詞頻時(shí),通常需要查詢當(dāng)前詞是否已經(jīng)出現(xiàn)過(guò),如果出現(xiàn)過(guò),那么次數(shù)增1。通常我用dict來(lái)保存詞和詞頻。我常用的方式是:

if word not in vocab_dict:
    vocab_dict[word] = 0
vocab_dict[word] += 1

用了很久覺(jué)得速度還行。 
后來(lái)看到有大神是這么用的:

if word not in vocab_dict.keys():
    vocab_dict[word] = 0
vocab_dict[word] += 1

感覺(jué)這樣似乎合理一些,因?yàn)槲乙龅谋緛?lái)就是??磜ord是否是vocab_map的key.于是之后都用這種方式。 
某天,處理大量文本,且文本屬于開(kāi)放領(lǐng)域,詞匯量也大,采用第二種方式,速度極慢,這時(shí)候,以為是查詢dict本身比較慢,并沒(méi)有意識(shí)到是vocab_map.keys()的問(wèn)題。于是,將詞同時(shí)存入set,查詢時(shí)查set,速度快了很多。

if word not in vocab_set:
    vocab_dict[word] = 0
vocab_dict[word] += 1

抽取小部分?jǐn)?shù)據(jù),量化對(duì)比set、dict、dict.keys()的查詢速度,結(jié)果如下: 
1.查詢vocab_dict,打印語(yǔ)句:

print "time cost is %d ms." % ((end - begin).microseconds/1000)
time cost is 175 ms.

2.查詢vocab_dict.keys(),打印語(yǔ)句如下:

print "time cost is %d s." % ((end - begin).seconds)
time cost is 45 s.

3.查詢vocab_set,打印語(yǔ)句:

print "time cost is %d ms." % ((end - begin).microseconds/1000)
time cost is 168 ms.

和查詢vocab_dict差不多。

那么為什么dict.keys()查詢速度比另外兩個(gè)慢很多呢?這就要對(duì)比list、dict、set三種的數(shù)據(jù)結(jié)構(gòu)了。 
dict.keys()實(shí)際上是list(keys),是dict的所有key組成的list。查找一個(gè)元素是否在list中是以list的下標(biāo)為索引遍歷list.而查詢是否在dict中,是將key以hash值的形式直接找到key對(duì)應(yīng)的索引,根據(jù)索引可直接訪問(wèn)value。對(duì)量大的dict查詢,自然是后者快很多。 
而set和dict的存儲(chǔ)原理基本是一樣的,唯一不同的是,set沒(méi)有value,只有key。對(duì)查詢key是否在dict或sset內(nèi),效果基本上是一樣的。

由此,可以得出,如果存儲(chǔ)的數(shù)據(jù)會(huì)被反復(fù)查詢,且量大,那么,盡量不要用list,盡量用dict,如果元素不重復(fù),用set更好。查詢是否在dict內(nèi),也不要在用dict.keys()。

到此,關(guān)于“python中set、dict和dict.keys的性能對(duì)比”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注億速云網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI