Python 的 difflib SequenceMatcher 加速

2024-03-28

我使用 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(使用前将#替换为@)

Python 的 difflib SequenceMatcher 加速 的相关文章

  • Beautiful Soup 中 find_all 方法的返回类型是什么?

    from bs4 import BeautifulSoup SoupStrainer from urllib request import urlopen import pandas as pd import numpy as np imp
  • 用于多输入图像的 VGG16 网络

    我正在尝试将 VGG16 网络用于多个输入图像 使用具有 2 个输入的简单 CNN 训练该模型给了我一个 acc 大约 50 这就是为什么我想使用 VGG16 这样的既定模型进行尝试 这是我尝试过的 imports from keras a
  • 在 Tensorflow 中使用队列将数据馈送到网络时分开验证和训练图

    我一直在做大量关于如何使用队列将数据正确输入网络的研究 但是 我在互联网上找不到任何解决方案 目前我的代码能够读取训练数据并执行训练 但无需验证和测试 这里有一些重要的行构成了我的代码 images volumes utils inputs
  • 如何让电脑看起来像是在打字? [复制]

    这个问题在这里已经有答案了 我希望它看起来像是计算机正在尝试向用户输入信息 我尝试了一些代码 但是当我运行它时 它只是一次打印所有内容 即使我一次打印 1 个 A Random sentence for x in A time sleep
  • 自定义 pytest junitxml 失败报告

    我正在尝试内省测试失败并将附加数据包含到 junit xml 测试报告中 具体来说 这是对外部产品的一套功能测试 我想将产品的日志包含到故障报告中 使用找到的方法here https stackoverflow com questions
  • Python 是否有与 PHP 函数 htmlspecialchars() 等效的函数?

    Python 中是否有与 PHP 函数 htmlspecialchars 类似或等效的函数 到目前为止我发现的最接近的是htmlentitydefs entitydefs 我所知道的最接近的是cgi escape http docs pyt
  • 如何根据本地目录中的requirements.txt 文件使用pip 安装软件包?

    问题是这样的 我有一个要求 txt文件看起来像 BeautifulSoup 3 2 0 Django 1 3 Fabric 1 2 0 Jinja2 2 5 5 PyYAML 3 09 Pygments 1 4 SQLAlchemy 0 7
  • 为什么playsound函数无法在python中播放我的mp3文件

    所以基本上我试图创建一个音乐播放程序 可以在您要求时播放音乐 我只是想让歌曲播放部分实际工作 所以我编写了一个超级简单的代码来测试它 import playsound playsound sample mp3 This was done i
  • buildozer android NDK 未下载 Ubuntu

    我使用的是 Ubuntu 16 04 LTS 操作系统 我已经在 python2 和 python3 中安装了 buildozer android sdk 已安装 但 buildozer 在下载 android NDK 时显示错误 请帮我解
  • 提升 ggplot2 性能

    The ggplot2软件包无疑是我使用过的最好的绘图系统 只是对于较大的数据集 约 50k 点 来说性能并不是很好 我正在考虑通过 Shiny 提供网络分析 使用ggplot2作为绘图后端 但我对其性能并不满意 尤其是与基础图形相比 我的
  • 如何设置 QTableView 中特定单元格的线条样式?

    我正在使用 QT GUI 我正在使用 QTableView 实现一个简单的十六进制编辑控件 我最初的想法是使用一个有十七列的表格 表的每一行都有 16 个十六进制字节 然后在第十七列中显示该数据的 ASCII 表示形式 理想情况下 我想编辑
  • 计算具有不均匀间隔点的 3D 梯度

    我目前有一个由几百万个不均匀间隔的粒子组成的体积 每个粒子都有一个属性 对于那些好奇的人来说是潜力 我想计算其局部力 加速度 np gradient 仅适用于均匀分布的数据 我在这里查看 numpy 中的二阶梯度 https stackov
  • 将收藏计数器变成字典

    我有一个由该函数产生的集合结果 Counter df email address 它返回每个单独的电子邮件地址及其重复次数 Counter nan 1618 email protected cdn cgi l email protectio
  • Python 比 C++ 更快、更轻吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 即使在 virtualenv 激活后,python 也指向全局安装

    有点奇怪 我激活了虚拟环境python仍然指向全局安装 which python usr bin python source virtualenv bin activate virtualenv which python usr bin p
  • 如何获得 GTK 中的默认颜色?

    Context 在 GTK 3 中 人们可以设置自己的主题 甚至默认主题 Adwaita 也提供两种变体 浅色和深色 当我编写自己的小部件 用Python 时 我需要获取这些颜色以避免在黑色上绘制黑色或在白色上绘制白色 Question 如
  • 如何在QTextEdit中自动滚动文本(动画效果)?

    我想问一下如何让QTextEdit中的文字滚动 达到动画效果 动画效果应该类似于视频中所示的效果 https www youtube com watch v MyeuGdXv4XM https www youtube com watch v
  • 在 Python 中规范化数字列表

    我需要对值列表进行标准化以适应概率分布 即在 0 0 和 1 0 之间 我明白how标准化 但很好奇 Python 是否有一个函数可以自动执行此操作 我想从 raw 0 07 0 14 0 07 to normed 0 25 0 50 0
  • 将行追加到 Pandas DataFrame 添加 0 列

    我正在创建一个 Pandas DataFrame 来存储数据 不幸的是 我无法提前知道我将拥有的数据行数 所以我的方法如下 首先 我声明一个空的 DataFrame df DataFrame columns col1 col2 然后 我附加
  • 根据另一个 csv 文件过滤 csv 文件中的行并将过滤后的数据保存在新文件中

    大家好 所以我试图根据file1过滤file2 其中file1是file2的子集 但 file2 有一个描述列 我需要能够分析 file1 中的数据 我想做的是过滤 file2 并仅获取 file1 中的标题及其描述 我尝试了这个 但我不太

随机推荐