2017-06-07 2 views
0

Situation: Vergleichen von Zeichenfolgen in DateiA mit vordefinierten Zeichenfolgen in DateiB. Beispiel für die Funktion in meinem Code:Schnellste Möglichkeit zum Vergleichen von Strings Python

string = open('fileA', 'r') 
stringlist = open('fileB', 'r') 

//compare the strings 
for i in string: 
    for j in stringlist: 
     if i == j: 
      print("Same String found!" + i + " " + j) 

Problem: In meinem aktuellen Programm, string mehr als 200 Strings enthalten, während stringlist eine Datei mit mehr als 50.000 Strings ist. Die geschachtelte for-Schleife ist, wie ich gelesen habe, langsam als Vergleichsfunktion.

Frage: Was ist der schnellste Weg, um den Inhalt beider Dateien zu vergleichen?

Weitere Informationen 1: Beide Dateien sind CSV-Dateien und werden in meinem Programm als CSV-Trennzeichen geöffnet.

Weitere Informationen 2: Strings sind MD5-Hashes (32 Zeichen).

Weitere Informationen 3: Ich bin offen für andere Möglichkeiten, die Zeichenfolgen zu speichern, d. H. Vergleichen Sie die Zeichenfolgen on-the-fly, anstatt sie in Datei A zu speichern.

Weitere Informationen 4: Ich bin auch offen für andere Methoden oder Module, die ich verwenden kann (z. B. Threading/Parallelverarbeitung) - Geschwindigkeit ist hier der Schlüssel.

Antwort

0

sollten Sie verwenden sets:

setA = set(listA) 
setB = set(listB) 
common = setA.intersection(setB) 

common jetzt hält alle Fäden, die in beide vorhanden sind Listen

Sie können dies auch mit einem Einzeiler tun:

Wenn Sie diesen Vergleich "on the fly" machen können, ist es natürlich besser und schneller als die Listen in eine Datei zu speichern und dann erneut aus dieser Datei zu lesen, Sie erhalten dadurch nichts.

Und natürlich Duplikate zu drucken:

for x in common: 
    print(x) 
+0

Ich erzeuge nur 'strings'. 'stringlist' ist eine Datei, die aus dem Internet heruntergeladen wird. Ich habe Pläne, es in RAM für vermeintlich schneller Zugriff zu laden –

+1

Dann speichern Sie 'string' nicht in Datei und laden' stringlist' in den Speicher wie Sie sagten, das ist optimal. solange die 'stringlist'-Datei nicht zu groß ist, damit Ihr Speicher eine letzte Frage enthält: –

+0

So kann ich Threading für optimale Geschwindigkeit verwenden: thread1 = // hash; thread2 = // vergleichen; // thread1 an thread2 übergeben; // thread2 vergleicht, während thread1 eine neue Datei hasht –

3

Wenn Sie in Ordnung sind mit nicht Duplikate Druck, set.intersection verwenden, sollten wirklich schnell sein:

list1 = ["hello", "world", "foo"] 
list2 = ["foo", "bar", "baz"] 

set(list1).intersection(list2) 
# {'foo'} 
+0

Wenn ich die Duplikate drucken wollen, ist es eine Möglichkeit? –

+1

@TimothyWongGlash Ich kann mir keinen anderen Weg vorstellen, als List-Comprehensions zu verwenden. '[s für s in list1 wenn s in list2]' aber dies berücksichtigt nicht die Duplikate (Wiederholungen) in list2. Sie müssen also eine zweite Schleife durchführen, die überladene Ergebnisse liefert und in der Leistung der Frage ähnlich ist. Vielleicht können Sie 'collections.Counter' verwenden, um zu ermitteln, wie viele Duplikate vorhanden sind, und entsprechend drucken, aber das wäre nicht in der gleichen Reihenfolge. – umutto

Verwandte Themen