一直找不到好用的 diff 模块,于是花了两天的时间将 Python 标准库中的 difflib 移植到了 JavaScript 上。做了详尽的测试,同时也将原文档也按照 JavaScript 的风格修改了。希望能对各位有用 :)
可以用来比较两篇文章的相似性吗?
这个不错。
哇
可以,SequenceMatcher
对象有 ratio() 这个方法,可以用于计算相似度。
@xqunix cool
@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 我再测一遍,也可能是我的代码有问题
挖出来~~