我有一本通过阅读大量图像文件创建的字典。它看起来像这样:
files = { 'file1.png': [data...], 'file2.png': [data...], ... 'file1000': [data...]}
我正在尝试处理这些图像以查看它们彼此之间的相似程度。问题是,有1000个文件值得数据,这是永远的。我确信我有20个不同的地方可以优化,但我正在尝试一次完成一件,看看我如何才能更好地优化它。
我的原始方法针对所有其余文件测试了file1。然后我针对所有文件测试了file2。但我仍然针对file1测试它。所以,当我在上面的例子中找到file1000时,我甚至不需要在那时测试任何东西,因为它已经被测试了999次。
这就是我的尝试:
answers = {}
for x in files:
for y in files:
if y not in answers or x not in answers[y]:
if(compare(files[x],files[y]) < 0.01):
answers.setdefault(x, []).append(y)
这不起作用,因为我现在得到了错误的输出。比较功能就是这样:
rms = math.sqrt(functools.reduce(operator.add,map(lambda a,b: (a-b)**2, h1[0], h2[0]))/len(h1[0]))
return rms
我只是不想将这个巨大的等式放入if语句中。
有没有人有一个很好的方法来比较文件字典的每个数据段而不重叠比较?
修改
在尝试了ShadowRanger的回答之后,我意识到我可能还没有完全理解我需要的东西。我的原始答案字典看起来像这样:
{ 'file1.png': ['file1.png', 'file23.png', 'file333.png'],
'file2.png': ['file2.png'],
'file3.png': ['file3.png', 'file4.png', 'file5.png'],
'file4.png': ['file3.png', 'file4.png', 'file5.png'],
...}
现在我将结果存储在这样的文件中:
file1.png file23.png file33.png
file2.png
file3.png file4.png file5.png
file6.png
...
我认为通过使用组合并且仅测试单个文件一次我将节省大量时间重新测试文件而不必浪费时间去除重复的答案。但据我所知,这些组合实际上降低了我找到比赛的能力,我不知道为什么。
答案 0 :(得分:2)
您可以避免冗余比较with itertools.combinations
to get order-insensitive unique pairs。只需import itertools
并替换你的双重嵌套循环:
for x in files:
for y in files:
使用单个循环获取组合:
for x, y in itertools.combinations(files, 2):