python中的distance包提供了一个hamming距离计算器:import distance
distance.levenshtein("lenvestein", "levenshtein")
distance.hamming("hamming", "hamning")
还有一个提供levenshtein距离计算的levenshtein包。最后difflib可以提供一些简单的字符串比较。
在this old question上有关于所有这些的更多信息和示例代码。
您现有的代码速度很慢,因为您在最内部的循环中重新计算文件哈希,这意味着每个文件都会被哈希多次。如果首先计算哈希值,则该过程将更高效:files = ...
files_and_hashes = [(f, pHash.imagehash(f)) for f in files]
file_comparisons = [
(hamming(first[0], second[0]), first, second)
for second in files
for first in files
if first[1] != second[1]
]
这个过程从根本上涉及到O(N^2)比较,因此要以适合map-reduce问题的方式分发它,需要获取完整的字符串集,并将它们划分为B块,其中B^2 = M(B=字符串块的数目,M=工作者的数目)。因此,如果你有16个字符串和4个工作线程,你可以将字符串列表分成两个块(因此块大小为8)。划分工作的示例如下:all_strings = [...]
first_8 = all_strings[:8]
last_8 = all_strings[8:]
compare_all(machine_1, first_8, first_8)
compare_all(machine_2, first_8, last_8)
compare_all(machine_3, last_8, first_8)
compare_all(machine_4, last_8, last_8)