3 回答

TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
由于您使用的是 Python 3.6+,因此可以節(jié)省廉價(jià)內(nèi)存:使用dict,而不是set. 盡管需要為每個(gè)元素存儲(chǔ)一個(gè)值,dict但即使在舊版本的 Python 中,s 也經(jīng)常使用更少的內(nèi)存(它們針對(duì)不同的事物進(jìn)行了優(yōu)化;set傾向于過度分配桶以降低桶沖突的風(fēng)險(xiǎn),但這會(huì)花費(fèi)更多內(nèi)存) ; 在 3.6+ 中,他們轉(zhuǎn)向更緊湊的dict設(shè)計(jì),只要唯一數(shù)據(jù)不是很大,就可以節(jié)省更多(set當(dāng)唯一項(xiàng)目的數(shù)量超過2**15/32768 時(shí),s 可以再次開始贏得某些大小,因?yàn)榫o湊性收益下降在那一點(diǎn)上戲劇性地)。
因此,要更改它,只需執(zhí)行以下操作:
a = {}
x = int(input())
for _ in range(x):
a[input()] = None
print(len(a))
此外,為了速度,如果您不需要使用input,您可能應(yīng)該避免使用它并直接讀取sys.stdin;input做了很多不必要的輸出刷新和其他你在這里并不真正需要的工作。所以這樣做可能會(huì)更快:
import itertools, sys
x = int(input())
a = dict.fromkeys(itertools.islice(sys.stdin.buffer, x))
print(len(a))
它只是直接拉動(dòng)線條而無需修改,并將它們直接推入dictC 級(jí)以獲得額外的速度。更改sys.stdin以sys.stdin.buffer避免在所有解碼串,并在包裝map(str.rstrip, ...)或map(bytes.rstrip, ...)用于sys.stdin.buffer去除換行符(如果最后一行可能無法在新行結(jié)束了,這是必要的正確性,我想這樣可以節(jié)省內(nèi)存微不足道的金額)。
如果輸入可能很大(更高的五位數(shù)唯一輸入),那么dict可能無濟(jì)于事,所以堅(jiān)持使用set,但您仍然可以使用sys.stdin優(yōu)化,導(dǎo)致最終形式如下:
x = int(input())
a = set(itertools.islice(map(bytes.rstrip, sys.stdin.buffer), x))
print(len(a))

TA貢獻(xiàn)1804條經(jīng)驗(yàn) 獲得超7個(gè)贊
根據(jù)數(shù)據(jù)的預(yù)期性質(zhì):
對(duì)于字典單詞,尤其是相似的單詞,請(qǐng)使用 trie
對(duì)于長(zhǎng)文本,使用無損壓縮
zlib壓縮示例:
import zlib
a = set()
x = int(input())
for _ in range(x):
a.add(zlib.compress(input().encode()))
#a.add(input())
print("unique: ", len(a))
print("memory: ", sum(len(b) for b in a))
未壓縮:
> echo -e "3\naaaaaaaaaaaaaaaa\nbbbbbbbbbbbbbbbb\naaaaaaaaaaaaaaaa" | python3 c.py
unique: 2
memory: 32
壓縮:
> echo -e "3\naaaaaaaaaaaaaaaa\nbbbbbbbbbbbbbbbb\naaaaaaaaaaaaaaaa" | python3 c.py
unique: 2
memory: 22

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超4個(gè)贊
它給我?guī)砹?2 個(gè)解決方案。第一個(gè)是使用 JSON 結(jié)構(gòu)。JSON 結(jié)構(gòu)使用唯一鍵,然后,您可以創(chuàng)建此結(jié)構(gòu),然后檢查您有多少鍵。
代碼看起來像這樣
對(duì)于這兩個(gè)例子,我假設(shè)你有一個(gè)包含所有單詞的數(shù)組,這個(gè)數(shù)組將是 words_array
unique_words = {}
for word in words_array:
unique_words[word.lower().strip()] = 1
# this one could be any value
# i just need to create the key value
print len(unique_words)
我使用lower并strip確保這個(gè)詞是獨(dú)一無二的,無論單詞中的大寫還是空格。
另一種方法是如果單詞已存在則檢查數(shù)組,此方法有效但效率較低
unique_words = []
for word in words_array:
w = word.lower().strip()
if not w in unique_words:
unique_words.append(w)
print len(unique_words)
如果您正在尋找內(nèi)存效率,我會(huì)建議其他替代方案,例如使用 C
添加回答
舉報(bào)