Python SequenceMatcher Overhead - 100% de utilização da CPU e processamento muito lento

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

  •  18-09-2019
  •  | 
  •  

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
Foi útil?

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
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top