Python的difflib SequenceMatcher加速

标签 python performance python-2.7 difflib

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

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

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

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

最佳答案

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

文件适合内存

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

看看fuzzy_string_cmp.pydiff.py看看我是怎么做到的。

备选

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

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

diff.py您可以看到我如何使用该库来获得创建 dmp_quick_ratio 的灵感。

我的测试表明使用 diff_match_patch比 Python 的 difflib 快 20 倍。

关于Python的difflib SequenceMatcher加速,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25680947/

相关文章:

python - future 最小 Pandas 数据框

python - get_absolute_url - Django 的站点地图

php - 存储文件大小的效率与每次计算它的效率?

python - 在 double_scalars 中遇到除以零进行导数计算

python - 列表理解将 bool 值放在列表中而不是整数中

python - 在将对象作为参数传递时,如何在使用 "yield"时更新其变量?

python - GAE cron 重试参数

jquery - 在 jQuery AJAX 请求到 Flask 之后渲染 Jinja

node.js - 如何使用 RethinkDB 耗尽机器资源?

php - PHP中变量扩展与sprintf的性能