您可能會考慮trie或DAWG或數據庫。有幾個相同的Python實現。
下面是一些相對定時爲你考慮一組VS列表:
import timeit
import random
with open('/usr/share/dict/words','r') as di: # UNIX 250k unique word list
all_words_set={line.strip() for line in di}
all_words_list=list(all_words_set) # slightly faster if this list is sorted...
test_list=[random.choice(all_words_list) for i in range(10000)]
test_set=set(test_list)
def set_f():
count = 0
for word in test_set:
if word in all_words_set:
count+=1
return count
def list_f():
count = 0
for word in test_list:
if word in all_words_list:
count+=1
return count
def mix_f():
# use list for source, set for membership testing
count = 0
for word in test_list:
if word in all_words_set:
count+=1
return count
print "list:", timeit.Timer(list_f).timeit(1),"secs"
print "set:", timeit.Timer(set_f).timeit(1),"secs"
print "mixed:", timeit.Timer(mix_f).timeit(1),"secs"
打印:
list: 47.4126560688 secs
set: 0.00277495384216 secs
mixed: 0.00166988372803 secs
即匹配一組的10000個字與一組25萬個字是17,085 X更快比匹配相同的250,000單詞列表中相同的10000個單詞列表。使用源代碼列表和成員資格測試集合是28,392 X更快比單獨未排序列表更快。
對於成員資格測試,列表是O(n),集合和字典是O(1)用於查找。
結論:爲600萬行文本使用更好的數據結構!
是否有任何理由不能使用一組單詞來代替?可能有6億行,但使用的英語單詞少得多(如果不清除它,甚至包括前導和尾隨標點符號)。測試集合中的成員應該非常快。 – DSM
@DSM:O(1)實際上,假設散列衝突相對較少:) –
您無法檢查項目是否在列表中有效。這不是列表的目的。你需要選擇你的數據類型(特別是集合),以適合你將要使用的數據類型,因爲沒有任何數據類型對每件事都很好。 – Ben