Python Sequencematcher النفقات العامة - استخدام وحدة المعالجة المركزية 100٪ ومعالجة بطيئة للغاية

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

  •  18-09-2019
  •  | 
  •  

سؤال

أنا أستخدم Difflib لمقارنة الملفات في دليلين (إصدارات من السنوات المتتالية). أولا، أنا أستخدم FileCMP للعثور على الملفات التي تغيرت ثم باستخدام Diffleib.SeconEXEMACER لمقارنتها وإنشاء فرق HTML كما هو موضح هنا.

ومع ذلك، أجد أن البرنامج يستغرق وقتا طويلا لتشغيل وبيثون يستخدم وحدة المعالجة المركزية بنسبة 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
هل كانت مفيدة؟

المحلول

إجابتي هي طريقة مختلفة للمشكلة تماما: حاول استخدام نظام تحكم الإصدار مثل GIT للتحقيق في كيفية تغير الدليل على مر السنين.

قم بإجراء مستودع خارج الدليل الأول، ثم استبدال المحتويات مع الدليل العام المقبل والالتزام بذلك كتغيير. (أو نقل دليل .git إلى الدليل العام المقبل، للحفظ على نسخ / حذف). كرر.

ثم قم بتشغيل Gitk، وستتمكن من معرفة ما هو تغير بين أي مراجعتين من الشجرة. إما أن تم تغيير الملف الثنائي، أو مع فرق لملفات نصية.

نصائح أخرى

يمكنك أيضا تجربة 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