2016-11-17 3 views
0

Wenn ich eine Liste von 10.000 Wörtern habe, was ist eine optimierte Möglichkeit zu überprüfen, ob ein Wort in dieser Liste ist, das die App nicht bis zum Crawlen verlangsamt?Check-Wort gegen sehr große Liste

Sollte ich die Wörter aus einer Datei laden und überprüfen Sie das?

def check_for_word(word): 
    HUGE_LIST = [...] # 10,000 Words 
    if word in HUGE_LIST: 
     return True 
    else: 
     return False 
+0

Ist es zwingend erforderlich, dass Sie eine Liste verwenden, um diese Wörter zu speichern? 10.000 ist nicht so riesig, um im Speicher zu speichern, aber es kann langsam sein, um zu verarbeiten. Ein Baum wäre angemessener. EDIT: Realisiert, dass ein Set wahrscheinlich viel besser war. –

Antwort

4

eine Liste konvertieren zu setzen - Strings sind hashable kann so eingestellt leicht erstellt werden.

Nachschlagen in Menge ist O (1), wo für Liste ist es O (n), wobei n eine Länge der Liste ist.

Denken Sie auch daran, die Erstellung einer riesigen Liste und eines riesigen Satzes außerhalb des Funktionskörpers zu verschieben. Zurzeit wird die Liste jedes Mal neu erstellt, wenn die Funktion aufgerufen wird.

Liste Timings:

$ python -m timeit -s "words = list(map(str, xrange(10000)))" -n 10000 "'5000' in words" 
10000 loops, best of 3: 58.2 usec per loop 

Frozenset Timings:

$ python -m timeit -s "words = frozenset(map(str, xrange(10000)))" -n 10000 "'5000' in words" 
10000 loops, best of 3: 0.0504 usec per loop 
+0

Beachten Sie jedoch, dass die Erstellung von Mengen länger dauert als die Erstellung normaler Listen. –

2
  • Wenn Sie keine Änderung in der Liste wird zu tun, verwenden Sie tuple statt Liste.

  • Wenn die Elemente in der Liste eindeutig sind, ist es noch besser, set dann zu verwenden.

Lookup mit Tupel schneller wird/set im Vergleich in der Liste zum Nachschlagen

1

lesen die Wörter in einer Datei und sie in einem set von Wörtern. Die Mitgliedschaft in einem Set zu überprüfen ist sehr schnell (und 10.000 ist nicht "sehr groß" :-)).

with open('words.txt') as words: 
    wordset = {word.strip() for word in words} 

return word in wordset 

(obwohl es, wenn Sie es in jeder Zeit zu lesen, um nicht helfen würde, halten Sie es um in einer Variablen - den Aufbau der Satz jedes Mal länger dauert als die Überprüfung, ob ein Wort in in es ist, originelle Art und Weise)

0

Sie können einen leicht indirekten Weg zu nehmen, eine Funktion zu schreiben, die eine Datei enthält alle Ihre Worte gegeben, gibt eine Funktion Mitgliedschaft

def make_checker(fname): 
    with open(fname) as f: 
     # Hp: one word per line, you can adjust the code for a different format 
     # this line builds a set by a _set comprehension_ 
     words = {word.strip() for word in f} 
    def the_checker(word): 
     return word in words 
    return the_checker 

, die Sie mögen diese

können Sie überprüfen,