Python Sequencematcher Overhead - 100% CPU -Auslastung und sehr langsame Verarbeitung

StackOverflow https://stackoverflow.com/questions/1870646

  •  18-09-2019
  •  | 
  •  

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
War es hilfreich?

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top