2009-12-08 2 views
1

Я использую 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 

ответ

3

Мой ответ иной подход к проблеме в целом: Попробуйте использовать систему управления версиями, как мерзавец, чтобы исследовать, как каталог изменился за эти годы.

Сделайте репозиторий из первого каталога, затем замените его содержимым на каталог следующего года и зафиксируйте это как изменение. (или переместите каталог .git в каталог следующего года, чтобы сохранить при копировании/удалении). повторение.

Затем запустите gitk, и вы сможете увидеть, что изменилось между любыми двумя версиями дерева. Либо просто изменился бинарный файл, либо с помощью diff для текстовых файлов.

+0

Почему бы не просто использовать GNU diff вместо этого? – ChristopheD

+0

@ChristopheD, Git использует diff для отображения различий. Тем не менее, он многое делает для вас: он определяет, какие файлы не изменились, и дает разницу только тем, которые изменились. Затем gitk завершает все это в дружественном графическом интерфейсе, где вы можете легко просматривать различные версии. Этот ответ имеет смысл для меня. – steveha

+0

@PeterCordes: Это приятное решение - используя метаданные GIT, чтобы получить информацию о том, где произошло изменение. Тем не менее, это не поможет мне, так как в настоящее время все данные предыдущего года резервируются в файловой системе, и у меня нет прямого доступа к CVS. @ChristopheD: На самом деле я использовал команду diff раньше из сценария оболочки, но затем вы получаете только детали на уровне строки (добавление/удаление). С python difflib вы получаете точную информацию о том, какие символы были вставлены, удалены, заменены из API. Итак, я перешел на python difflib. – shauvik

 Смежные вопросы

  • Нет связанных вопросов^_^