einen Satz erstellen gerade von:
with open('C:/A.txt') as a:
with open('C:/B.txt') as b:
lines = set(b)
for line in a:
if line not in lines:
print(line)
Vielleicht ein besserer Weg, so etwas wie dieses würde die Hashes der Zeilen in Datei B - und vergleichen Sie die Zeilen in A mit denen in diesem Satz -
Solch ein Set dauert etwa hundert Megabyte Speicher, sollte daher in den Speicher in einem Notebook oder wo passen rkstation:
linesB = {hash(line) for line in open("fileB"))}
for line in open("fileA"):
if hash(line) not in linesB:
print (line)
Die Haupt Geschwindigkeit hier oben ist, dass für eine Linie linear innerhalb fileB im Gegensatz zu suchen, ist es nur einmal gelesen wird - und jede Zeile in einem Satz zur Verfügung gestellt, die eine konstante Look-up-Zeit hat. Daher kommen Sie von ~ 200.000 X 4.000.000 Vergleichen (O (m X n)) auf nur ~ 200.000 Vergleiche (O (m X 1)) herunter.
Das nicht zu schweigen von der Notwendigkeit, Daten aus dem filsystem 200.000 mal in den Programmspeicher zu verschieben.
Indem Sie nur die hash
Zeilen in B behalten Sie vermeiden, alle Textinformationen von DateiB im Speicher zu behalten - nur 24 Bytes für jeden Hash (in einem 64-Bit-System) - anstelle der Textinformation selbst (die von jedem abhängt Zeilenlänge) + sein Hash.
Haben Sie das sah in [ 'filecmp' Modul] (https : //docs.python.org/3/library/filecmp.html)? – karthikr
Dies ist ein klassisches Beispiel für [asymptotische Komplexität] (https://en.wikipedia.org/wiki/Asymptotic_computational_complexity), allgemein bekannt als [Große O-Notation] (https://en.wikipedia.org/wiki/Big_O_notation)).Die 'not in'-Anweisung muss die ganze Datei jedes Mal lesen, das ist O (n) (lineare Zeit - die Menge an Arbeit ist proportional zur Länge der Eingabe). Da Sie dies für jede Zeile in der ersten Datei einmal aufrufen, machen Sie diese lineare Menge an Arbeit eine lineare (O (n)) Anzahl von Malen. Als Ergebnis benötigt Ihr Algorithmus O (n) x O (n) oder O (n^2) Zeit, um zu laufen - auch bekannt als quadratische Zeit. – dimo414