Я использую difflib для сравнения файлов в двух каталогах (версии из последовательных лет). Во-первых, я использую filecmp для поиска файлов, которые были изменены, а затем итеративно с помощью difflib.SequenceMatcher, чтобы сравнить их и сгенерировать html diff, как описано here.Python SequenceMatcher Overhead - 100% загрузка процессора и очень медленная обработка
Однако, я считаю, что программа слишком долго запускается, а python использует 100% процессор. Во время профилирования я обнаружил, что вызов seqm.get_opcodes(), который принимает все время.
Любое понимание будет оценено по достоинству. Спасибо!
Код:
#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
Почему бы не просто использовать GNU diff вместо этого? – ChristopheD
@ChristopheD, Git использует diff для отображения различий. Тем не менее, он многое делает для вас: он определяет, какие файлы не изменились, и дает разницу только тем, которые изменились. Затем gitk завершает все это в дружественном графическом интерфейсе, где вы можете легко просматривать различные версии. Этот ответ имеет смысл для меня. – steveha
@PeterCordes: Это приятное решение - используя метаданные GIT, чтобы получить информацию о том, где произошло изменение. Тем не менее, это не поможет мне, так как в настоящее время все данные предыдущего года резервируются в файловой системе, и у меня нет прямого доступа к CVS. @ChristopheD: На самом деле я использовал команду diff раньше из сценария оболочки, но затем вы получаете только детали на уровне строки (добавление/удаление). С python difflib вы получаете точную информацию о том, какие символы были вставлены, удалены, заменены из API. Итак, я перешел на python difflib. – shauvik