我正在迭代大型字符串列表以找到类似的字符串(有几个不匹配)。以下代码有效但需要约20分钟,而我的目标是在5分钟内完成。有没有更有效的方法来做到这一点?这段代码的哪一部分是最有限的?
我有k=10
,mism=3
,seq
是由字符A,T,C和G组成的字符串。每个pattern
和kmer
是k个字符长。
我已经生成了patterns
长度为4 ** k(~1百万)的列表,以及kmers
长度为len(seq)-k + 1(~300)的列表。 frequent
是一本字典。
测试迭代花费的时间少于一分钟:
for i in range (0,4**k):
for j in range(0,len(kmers)):
pass
这是我需要提高效率的真正计算:
for pattern in patterns:
for kmer in kmers:
mism_counter=0
for j in range(0,k):
if not kmer[j]==pattern[j] : mism_counter+=1
if mism_counter <= mism :
if pattern in frequent:
frequent[pattern] += 1
else:
frequent[pattern] = 1
我尝试了维基百科的hamming_distance
函数而不是我的每个字符比较,并且还试图删除字典并将pattern
转储到列表中以便进一步处理。这些都没有改善循环的性能。任何帮助将不胜感激!
答案 0 :(得分:1)
这应节省一半的时间; - )
for pattern in patterns:
for kmer in kmers:
mism_counter=0
for j in range(0,k):
if kmer[j] != pattern[j] :
mism_counter+=1
if mism_counter > misn:
break
else:
if pattern in frequent:
frequent[pattern] += 1
else:
frequent[pattern] = 1
你必须做两件事才能让它变得非常快: