我使用difflib SequenceMatcher(ratio()方法)来定义文本文件之间的相似性。虽然difflib比较快,比较一小组文本文件,例如10个平均70kb的文件相互比较(46次比较)需要大约80秒。
这里的问题是我收集了3000个txt文件(平均75 kb),这是对SequenceMatcher完成比较工作需要多长时间的原始估计是80天!
我试过" real_quick_ratio()"和" quick_ratio()"方法,但它们不符合我们的需要。
有没有办法加快比较过程? 如果没有,还有其他更快的方法来完成这样的任务吗?即使它不在Python中。
答案 0 :(得分:3)
您发现的问题非常常见,因为difflib
未得到优化。以下是我在开发比较HTML文档的工具时发现的一些技巧。
创建两个列表,其中包含每个文件中的行。然后使用列表作为参数调用difflib.SequenceMatcher
。 SequenceMatcher
知道如何处理列表,并且该过程将更快,因为它是逐行完成而不是char by char。这可能会降低精度。
看看fuzzy_string_cmp.py和diff.py,看看我是如何做到的。
有一个很棒的名为diff_match_patch的图书馆,可以在pypi中找到。该库将在两个字符串之间执行快速差异并返回更改(添加行,行相等,删除行)。
通过利用diff_match_patch,您应该可以创建自己的dmp_quick_ratio
功能。
在diff.py中,您可以看到我如何使用该库来获取创建dmp_quick_ratio
的灵感。
我的测试表明,使用diff_match_patch的速度比Python的difflib
快20倍。
答案 1 :(得分:1)
有 difflib.SequenceMatcher
、cdifflib 的 C 实现。
替换 SequenceMatcher,所有 difflib 操作将快 4 倍
from cdifflib import CSequenceMatcher
import difflib
difflib.SequenceMatcher = CSequenceMatcher
答案 2 :(得分:-1)
你可以使用pypy获得一个小的加速