【问题标题】:Python's difflib SequenceMatcher speed upPython 的 difflib SequenceMatcher 加速
【发布时间】:2014-10-30 02:47:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: python performance python-2.7 difflib


    【解决方案1】:

    您发现的问题很常见,因为 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 倍。

    【讨论】:

      【解决方案2】:

      difflib.SequenceMatchercdifflib的C实现。

      替换 SequenceMatcher,所有 difflib 操作将快 4 倍左右

      from cdifflib import CSequenceMatcher
      import difflib
      difflib.SequenceMatcher = CSequenceMatcher
      

      【讨论】:

        【解决方案3】:

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

        http://pypy.org/

        【讨论】:

        • 这个建议太笼统了。
        • @andres.riancho 如果您有更好的答案,请告诉我。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多