我有两个文件,一个有4K字符串为4K行,一个有100K到100K行。
对于4k行中的每个字符串,我计算了字符串与100k字符串中每个字符串之间的相似性比率,我选择了具有最高相似度比率的100k行中的字符串作为"匹配&#34 ;到4k文件中的行。
我尝试使用python字典完成这项工作。我被告知它会很有效率。
但我的代码效率不高,请参阅以下内容:
for k,k2 in itertools.product(dict1.keys(),my_dict1.keys()):
a=float(difflib.SequenceMatcher(None,k,k2).ratio())
if a>0.80:
my_dict3[k+"t"+k2]=a
for key2 in my_dict3.keys():
k1=key2.split("t")[0]
k2=key2.split("t")[1]
mydict[k1][k2]=my_dict3[key2]
k=key2.split("t")
keylist4=mydict.keys()
for key4 in keylist4:
key=max(mydict[key4].iteritems(),key=operator.itemgetter(1))[0]
print "%st%s" % (key4,key)
我想知道为什么代码效率不高。但它应该是。如何提高?
我认为我做错了什么,但不确定在哪里。
谢谢!
答案 0 :(得分:2)
虽然这段特殊代码可以略微优化,但时间复杂度仍然是O(m*n)
,其中m
,n
是每个字典中的键数。
由于dict_1有4K
个密钥,而dict_2
有100K密钥,因此需要迭代的总组合数
100K*4K = 400M
如果对于每个组合,你需要0.1 ms
来计算出来的东西,那么完成这个程序的时间仍需要时间
400M/(10000*86400) = 472 days = 1.4 years
即使您能够按20%
提高效果,仍然可以1.4*0.8 = 1.1 year
。
即使您使用10个并发线程来执行此操作,也需要一个半月来运行此操作。
因此,最好找出针对您的这个问题的另一种算法解决方案,它在时间复杂度方面表现更好。