Python Sequencematcher Overhead - 100% CPU -Auslastung und sehr langsame Verarbeitung
Frage
Ich verwende DiFflib, um Dateien in zwei Verzeichnissen zu vergleichen (Versionen aus aufeinanderfolgenden Jahren). Zunächst verwende ich FileCMP, um Dateien zu finden, die sich geändert haben, und dann iterativ mit DiFflib.sequencematcher, um sie zu vergleichen und einen HTML -Diff wie erläutert zu generieren hier.
Ich stelle jedoch fest, dass das Programm zu lange dauert, um zu laufen, und Python verwendet 100% CPU. Pünktlich Profiling fand ich, dass das das seqm.get_opcodes () Rufen Sie an, was die ganze Zeit dauert.
Jede Einsicht wäre geschätzt. Vielen Dank !
Code:
#changed_set contains the files to be compared
for i in changed_set:
oldLines = open(old_dir +"/" + i).read()
newLines = open(new_dir +"/" + i).read()
seqm = difflib.SequenceMatcher(lambda(x): x in string.whitespace, oldLines, newLines)
opcodes = seqm.get_opcodes() #XXX: Lots of time spent in this !
produceDiffs(seqm, opcodes)
del seqm
Lösung
Meine Antwort ist ein anderer Ansatz für das Problem insgesamt: Versuchen Sie, ein Versionskontrollsystem wie Git zu verwenden, um zu untersuchen, wie sich das Verzeichnis im Laufe der Jahre verändert hat.
Machen Sie ein Repository aus dem ersten Verzeichnis, ersetzen Sie dann den Inhalt durch das Verzeichnis des nächsten Jahres und verpflichten Sie dies als Änderung. (oder verschieben Sie das .git -Verzeichnis in das Verzeichnis des nächsten Jahres, um beim Kopieren/Löschen zu sparen). wiederholen.
Führen Sie dann Gitk aus und Sie können sehen, was sich zwischen zwei Überarbeitungen des Baumes geändert hat. Entweder, dass sich eine binäre Datei geändert hat, oder mit einem Diff für Textdateien.
Andere Tipps
Sie können auch die ausprobieren diff-match-patch
Bibliothek kann es meiner Erfahrung nach zehnmal schneller sein.
BEARBEITEN: Beispiel meine andere Antwort hier
from diff_match_patch import diff_match_patch
def compute_similarity_and_diff(text1, text2):
dmp = diff_match_patch()
dmp.Diff_Timeout = 0.0
diff = dmp.diff_main(text1, text2, False)
# similarity
common_text = sum([len(txt) for op, txt in diff if op == 0])
text_length = max(len(text1), len(text2))
sim = common_text / text_length
return sim, diff