【发布时间】:2015-12-06 06:00:51
【问题描述】:
我有一本包含约 150,000 个键的字典。没有重复的键。每个键长 127 个字符,每个键在 1-11 个位置处不同(大多数差异发生在键的末尾)。每个键的值是一个唯一的 ID 和一个空白列表 []。对于给定的键,我想找到恰好相差 1 个字符的所有其他键,然后将 ID 附加到给定的键空白列表中。最后,我想要一个键和它的值(一个 ID 和一个所有键的列表,其中一个字符不同)。
我的代码可以运行,但问题是它太慢了。双 for 循环是 150,000^2 = ~250 亿。在我的电脑上,我每分钟可以循环约 200 万次(每次都执行 match1 功能)。这需要大约 8 天才能完成。没有 match1 函数的循环运行速度快了约 7 倍,因此将在约 1 天内完成。
我想知道是否有人知道我可以如何提高这个速度?
# example dictionary
dict = {'key1' : ['1', []], 'key2' : ['2', []], ... , 'key150000' : ['150000', []]}
def match1(s1,s2,dict):
s = 0
for c1, c2 in zip(reversed(s1), reversed(s2)):
if s < 2:
if c1 != c2:
s = s + 1
else:
break
if s == 1:
dict1[s1][1].append(dict1[s2][0])
for s1 in dict:
for s2 in dict:
match1(s1,s2,dict)
【问题讨论】:
-
不要将变量命名为“dict”。 dict1 取自哪里?
-
你不需要第二个循环从头开始,因为你会多次比较相同的键
-
另外,您不必颠倒字符串(此处为 s1 和 s2)。而是从 n-1 向后迭代到 0。这将减少一些时间,尽管在复杂性方面它仍然是相同的。由于两个反向的函数调用,将产生双重影响。
标签: python performance for-loop