4

我正在使用 difflib SequenceMatcher(ratio() 方法)来定义文本文件之间的相似性。虽然 difflib 比较一小部分文本文件的速度相对较快,例如 10 个 70 kb 的文件平均相互比较(46 个比较)大约需要 80 秒。

这里的问题是我收集了 3000 个 txt 文件(平均 75 kb),对 SequenceMatcher 完成比较工作需要多少时间的原始估计是 80 天!

我尝试了“real_quick_ratio()”和“quick_ratio()”方法,但它们不符合我们的需要。

有什么方法可以加快比较过程?如果没有,有没有其他更快的方法来完成这样的任务?即使它不在 Python 中。

4

3 回答 3

7

您发现的问题很常见,因为difflib没有优化。以下是我多年来在开发比较 HTML 文档的工具时发现的一些技巧。

文件适合内存

创建两个列表,包含每个文件中的行。然后difflib.SequenceMatcher使用列表作为参数调用。知道如何处理列表,并且该SequenceMatcher过程会更快,因为它是逐行完成的,而不是逐个字符的。这可能会降低精度。

看看fuzzy_string_cmp.pydiff.py看看我是如何做到这一点的。

选择

pypi 中有一个很棒的库,叫做diff_match_patch。该库将在两个字符串之间执行快速差异并返回更改(添加的行、相等的行、删除的行)。

通过利用diff_match_patch您应该能够创建自己的dmp_quick_ratio函数。

diff.py 中,您可以看到我如何使用该库来获得创建dmp_quick_ratio.

我的测试表明,使用diff_match_patch比 Python 的difflib.

于 2018-05-09T12:01:35.937 回答
1

There is a C implementation of difflib.SequenceMatcher, cdifflib.

Replace the SequenceMatcher and all difflib operations will be about 4x faster

from cdifflib import CSequenceMatcher
import difflib
difflib.SequenceMatcher = CSequenceMatcher
于 2021-03-18T15:30:56.717 回答
-6

您可以使用 pypy 获得小幅加速

http://pypy.org/

于 2015-06-30T07:32:57.000 回答