如何提高脚本的效率?

时间:2014-11-14 03:16:46

标签: python algorithm dictionary

我有两个文件,一个有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) 

我想知道为什么代码效率不高。但它应该是。如何提高?

我认为我做错了什么,但不确定在哪里。

谢谢!

1 个答案:

答案 0 :(得分:2)

虽然这段特殊代码可以略微优化,但时间复杂度仍然是O(m*n),其中mn是每个字典中的键数。

由于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个并发线程来执行此操作,也需要一个半月来运行此操作。

因此,最好找出针对您的这个问题的另一种算法解决方案,它在时间复杂度方面表现更好。