我正在迭代遍历大量字符串列表以查找相似字符串(有几个不匹配)。以下代码有效,但需要约20分钟的时间,而我的目标是在5分钟内完成。有没有更有效的方法来完成这个任务?哪一部分代码最具限制性?
我有 k=10,mism=3,seq 是由字符 A、T、C 和 G 组成的字符串。每个 pattern 和 kmer 都是 k 个字符长。
我已经生成了长度为 4**k(约100万)的 pattern 列表和长度为 len(seq)-k+1(约300)的 kmer 列表。frequent 是一个字典。
测试迭代仅需不到一分钟:
我有 k=10,mism=3,seq 是由字符 A、T、C 和 G 组成的字符串。每个 pattern 和 kmer 都是 k 个字符长。
我已经生成了长度为 4**k(约100万)的 pattern 列表和长度为 len(seq)-k+1(约300)的 kmer 列表。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
放入列表进行进一步处理。但这些都没有改善循环的性能。如有帮助,请提供!
for j in range(k)
;这会使每个外部循环额外增加10个循环。10次“不到一分钟”仍然接近10分钟,再加上if
测试和字典访问。 - Martijn Pietersseq
在哪里? - jfsif
可以移动到第一个循环中(在for kmer
结束后)吗? - Dunno