difflib.js ---- 用于生成 diff 信息的 node 模块
发布于 3年前 作者 xqunix 2742 次浏览

一直找不到好用的 diff 模块,于是花了两天的时间将 Python 标准库中的 difflib 移植到了 JavaScript 上。做了详尽的测试,同时也将原文档也按照 JavaScript 的风格修改了。希望能对各位有用 :)

地址: https://github.com/qiao/difflib.js

13 回复

可以用来比较两篇文章的相似性吗?

这个不错。

可以,SequenceMatcher 对象有 ratio() 这个方法,可以用于计算相似度。

@xqunix 請問相似度比較是用的什麼算法?

@guilin Ratcliff-Obershelp 算法

@xqunix 用了一下,速度有点慢啊

@guilin 数据有多少呢?

@xqunix 一个html,我替换了所有的link, 然后做diff

@guilin 确定瓶颈是在 diff 上么,我刚才拿 sina 的主页做了下 benchmark,总共 10244 行 html, 我复制一份并修改其中的10行,然后分别用 python 和 node 跑了100 遍 diff,代码如下:

node:

var fs = require('fs')
var difflib = require('difflib')

var a = fs.readFileSync('a').toString().split('\n')
var b = fs.readFileSync('b').toString().split('\n')

for (var i = 0; i < 100; ++i) {
  difflib.unifiedDiff(a, b)
}

python:

import difflib

a = open('a').readlines()
b = open('b').readlines()

for i in range(100):
    list(difflib.unified_diff(a, b))

测试结果如下:

$ time node diff.js

real    0m6.333s
user    0m6.316s
sys 0m0.077s

$ time python diff.py 

real    0m7.923s
user    0m7.913s
sys 0m0.007s

可见,对于 sina 的这个 10000+ 行的巨型 html ,平均每个 diff 的耗时也仅为 0.06 秒,而且在这个测试中 node 的性能要优于 python 。另外值得注意的是, python 的 difflib 从 2001 年开始便是标准库之一,其代码质量和性能都绝对有所保证。

@xqunix 我再测一遍,也可能是我的代码有问题

回到顶部