Python SequenceMatcherオーバーヘッド-100%CPU使用率と非常に遅い処理

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

  •  18-09-2019
  •  | 
  •  

質問

Difflibを使用して、2つのディレクトリ(連続年のバージョン)でファイルを比較しています。まず、FileCMPを使用して変更されたファイルを見つけ、次にdifflib.sequencematcherを使用してそれらを比較し、説明したようにHTML Diffを生成します ここ.

ただし、プログラムの実行には時間がかかりすぎて、Pythonが100%CPUを利用していることがわかりました。時間が経つにつれて、私はそれを見つけました 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
役に立ちましたか?

解決

私の答えは、問題に対する別のアプローチです。GITなどのバージョン制御システムを使用して、長年にわたってディレクトリがどのように変化したかを調査してみてください。

最初のディレクトリからリポジトリを作成し、コンテンツを翌年のディレクトリに置き換えて、変更としてコミットします。 (または、.gitディレクトリを来年のディレクトリに移動して、コピー/削除を節約します)。繰り返す。

次に、gitkを実行すると、ツリーの2つのリビジョン間で変化したものを確認できます。バイナリファイルが変更されたこと、またはテキストファイルのdiffを使用して。

他のヒント

あなたも試すことができます diff-match-patch 図書館、私の経験では、10倍高速になる可能性があります。

編集: ここで私の他の答えを例

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top