我需要比较大块的数据以确定它们是否相等,而且我需要每秒比较许多对数据,速度要快。每个对象具有相同的长度,但可能会有一些未知位置的轻微差异。
下面的时间表明,如果数据开始处有差异,则使用 ==
运算符非常快,而如果差异位于数据末尾,则速度明显较慢。
>>> import os
>>> s = os.urandom(1600*1200 - 1)
>>> Aimg = b"A" + s
>>> Bimg = b"B" + s
>>> img1 = s + b"1"
>>> img2 = s + b"2"
>>> %timeit Aimg == Bimg
61.8 ns ± 0.484 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
>>> %timeit img1 == img2
159 µs ± 2.83 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
在我的使用场景中,差异可能位于字节的中间或末尾(背景:这是未压缩的图像数据)。我想寻找一种使用哈希或校验和来加速处理的方法。使用md5会更慢,但Python内置的hash
实际上确实提高了速度。
>>> %timeit img1 == img2
160 µs ± 5.96 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
>>> %timeit hash(img1) == hash(img2) and img1 == img2
236 ns ± 5.91 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
我对该哈希的技术细节感兴趣,如果hash(a) == hash(b)
,那么a == b
是非常可能的吗?如果哈希冲突相对较少,则可以接受误报,意图是在平均情况下加速比较。
hash
函数是与架构相关的。 - JBernardo