我使用Python difflib
在相当长的文件之间创建全面的差异日志。一切都在顺利进行,直到我遇到了永无止境的差异问题。在挖掘之后,事实证明difflib
无法处理长序列的半匹配线。
这是一个(有点极小)的例子:
import sys
import random
import difflib
def make_file(fname, dlines):
with open(fname, 'w') as f:
f.write("This is a small file with a long sequence of different lines\n")
f.write("Some of the starting lines could differ {}\n".format(random.random()))
f.write("...\n")
f.write("...\n")
f.write("...\n")
f.write("...\n")
for i in range(dlines):
f.write("{}\t{}\t{}\t{}\n".format(i, i+random.random()/100, i+random.random()/10000, i+random.random()/1000000))
make_file("a.txt", 125)
make_file("b.txt", 125)
with open("a.txt") as ff:
fromlines = ff.readlines()
with open("b.txt") as tf:
tolines = tf.readlines()
diff = difflib.ndiff(fromlines, tolines)
sys.stdout.writelines(diff)
即使对于示例中的125行,Python花了超过4秒来计算和打印差异,而对于GNU Diff,它花了几毫秒。而且我遇到了问题,其中行数约为。大100倍。
这个问题有合理的解决方案吗?我希望使用difflib
,因为它产生相当不错的HTML差异,但我愿意接受建议。我需要一个可移植的解决方案,尽可能在尽可能多的平台上工作,尽管我已经在考虑移植GNU Diff了:)只要我不必重写整个库,就可以入侵difflib
。
PS。这些文件可能有可变长度的前缀,因此在不对齐diff上下文的情况下将它们拆分成部分可能不是最佳选择。