Python SequenceMatcher Overhead - 100% de utilização da CPU e processamento muito lento
Pergunta
Estou usando o Difflib para comparar arquivos em dois diretórios (versões de anos consecutivos). Primeiro, estou usando o FileCMP para encontrar arquivos que mudaram e depois usando iterativamente, difflib.sequencematcher para compará -los e gerar um diff html, conforme explicado aqui.
No entanto, acho que o programa está demorando muito para ser executado e o Python está utilizando 100% de CPU. No tempo de perfil, descobri que o seqm.get_opcodes () Ligue o que está levando o tempo todo.
Qualquer insight seria apreciado. Obrigado !
Código:
#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
Solução
Minha resposta é uma abordagem diferente do problema: tente usar um sistema de controle de versão como o Git para investigar como o diretório mudou ao longo dos anos.
Faça um repositório fora do primeiro diretório, substitua o conteúdo pelo diretório do próximo ano e cometê -lo como uma alteração. (ou mova o diretório .git para o diretório do próximo ano, para economizar na cópia/exclusão). repetir.
Em seguida, execute o Gitk e você poderá ver o que mudou entre duas revisões da árvore. Ou apenas um arquivo binário alterado ou com um diferencial para arquivos de texto.
Outras dicas
You can also try the diff-match-patch
library, in my experience it can be 10 times faster.
EDIT: Example my other answer here
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