我使用 difflib SequenceMatcher (ratio() 方法)来定义文本文件之间的相似性。虽然 difflib 比较一小组文本文件的速度相对较快,例如10 个 70 kb 的文件平均相互比较(46 次比较)大约需要 80 秒。
这里的问题是,我收集了 3000 个 txt 文件(平均 75 kb),对 SequenceMatcher 完成比较工作需要多少时间进行原始估计是 80 天!
我尝试了“real_quick_ratio()”和“quick_ratio()”方法,但它们不符合我们的需求。
有什么办法可以加快比较过程吗?
如果没有,还有其他更快的方法来完成这样的任务吗?即使它不是用 Python 编写的。
您发现的问题很常见,因为difflib
没有优化。以下是我多年来在开发比较 HTML 文档的工具时发现的一些技巧。
文件适合内存
创建两个列表,其中包含每个文件中的行。然后打电话difflib.SequenceMatcher
以列表作为参数。这SequenceMatcher
知道如何处理列表,并且该过程会快得多,因为它是逐行完成的,而不是逐字符完成的。这可能会降低精度。
看一眼模糊字符串cmp.py https://github.com/andresriancho/w3af/blob/43aeb4482a3701a05a0c0c594d22321b9969c6b6/w3af/core/controllers/misc/fuzzy_string_cmp.py#L86-L99 and diff.py https://github.com/andresriancho/w3af/blob/43aeb4482a3701a05a0c0c594d22321b9969c6b6/w3af/core/controllers/misc/diff.py#L67-L120看看我是如何做到这一点的。
选择
有一个很棒的图书馆叫做差异匹配补丁 https://pypi.org/project/diff-match-patch/这在 pypi 中可用。图书馆将表演fast比较两个字符串之间的差异并返回更改(添加行、等于行、删除行)。
通过利用差异匹配补丁 https://pypi.org/project/diff-match-patch/你应该能够创建自己的dmp_quick_ratio
功能。
In diff.py https://github.com/andresriancho/w3af/blob/43aeb4482a3701a05a0c0c594d22321b9969c6b6/w3af/core/controllers/misc/diff.py#L30-L64您可以看到我如何使用该库来获取创作灵感dmp_quick_ratio
.
我的测试表明使用差异匹配补丁 https://pypi.org/project/diff-match-patch/比 Python 快 20 倍difflib
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)