高效查找大型列表中的字符串不匹配

时间:2013-11-10 22:26:02

标签: python string performance comparison

我正在迭代大型字符串列表以找到类似的字符串(有几个不匹配)。以下代码有效但需要约20分钟,而我的目标是在5分钟内完成。有没有更有效的方法来做到这一点?这段代码的哪一部分是最有限的?

我有k=10mism=3seq是由字符A,T,C和G组成的字符串。每个patternkmer是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转储到列表中以便进一步处理。这些都没有改善循环的性能。任何帮助将不胜感激!

1 个答案:

答案 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

你必须做两件事才能让它变得非常快:

  • 压缩数据,以便您的程序减少工作量。您不必将GTAC表示为ascii字母(每个7位),而是每个字母2位就足够了。
  • 根据模式构建搜索trie以加快比较。您允许的不匹配搜索基本上会破坏您的模式数量。您可以使用带有额外边缘的trie来实现许多不匹配,但这实际上会使您的搜索设置变得非常大。