トライ、DAWG、またはデータベースを検討することもできます。同じものの Python 実装がいくつかあります。
セットとリストの相対的なタイミングを次に示します。
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 語のセットを 250,000 語のセットと照合すると、同じ 250,000 語のリスト内の同じ 10000 語のリストを照合するよりも17,085 倍高速です。ソースにリストを使用し、メンバーシップ テストにセットを使用すると、並べ替えられていないリストのみを使用するよりも28,392 倍高速です。
メンバーシップ テストの場合、リストは O(n) であり、セットとディクテーションはルックアップの O(1) です。
結論: 6 億行のテキストには、より適切なデータ構造を使用してください。