Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在大型列表中高效查找字符串不匹配_Python_String_Performance_Comparison - Fatal编程技术网

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

Python 在大型列表中高效查找字符串不匹配,python,string,performance,comparison,Python,String,Performance,Comparison,我正在遍历大型字符串列表以查找类似的字符串(有几个不匹配)。下面的代码可以工作,但需要大约20分钟,而我的目标是在5分钟内完成。有没有更有效的方法?此代码的哪一部分最具限制性 我有k=10,mism=3,seq是一个由字符a、T、C和G组成的字符串。每个模式和kmer都有k个字符长。 我已经生成了长度为4**k(~100万)的模式列表,以及长度为len(seq)-k+1(~300)的kmer模式列表频繁是一本字典 测试迭代花费的时间少于一分钟: for i in range (0,4**k):

我正在遍历大型字符串列表以查找类似的字符串(有几个不匹配)。下面的代码可以工作,但需要大约20分钟,而我的目标是在5分钟内完成。有没有更有效的方法?此代码的哪一部分最具限制性

我有
k=10
mism=3
seq
是一个由字符a、T、C和G组成的字符串。每个
模式和
kmer
都有k个字符长。 我已经生成了长度为4**k(~100万)的
模式列表,以及长度为len(seq)-k+1(~300)的
kmer模式列表<代码>频繁
是一本字典

测试迭代花费的时间少于一分钟:

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
对于模式中的模式:
对于kmer中的kmer:
mism_计数器=0
对于范围(0,k)内的j:
如果不是kmer[j]==模式[j]:mism_计数器+=1

如果mism_计数器这将节省一半的时间;-)

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

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

您有第三个循环:
用于范围(k)内的j
;这使得每个外部循环额外增加10个循环。10次“不到一分钟”仍然是近10分钟,加上
if
测试和字典访问。@MartijnPieters没有删除for循环将时间从O(n^3)减少到O(n^2)?@Dunno:3rd loop:k=10;第一个循环:4**k(~1e6)代码中的
seq
在哪里?另外,如果
完成,最后一个
是否可以移动到第一个循环(对于kmer
完成后)?
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