1

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
4

2 に答える 2

3

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

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

次に gitk を実行すると、ツリーの任意の 2 つのリビジョン間で何が変更されたかを確認できます。バイナリファイルが変更されただけか、テキストファイルの差分があります。

于 2009-12-08T23:43:18.033 に答える
1

ライブラリを試すことも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
于 2018-04-30T14:19:22.820 に答える