Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/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
如何更改for循环以高效地运行python_Python_Performance_For Loop_Optimization_Biopython - Fatal编程技术网

如何更改for循环以高效地运行python

如何更改for循环以高效地运行python,python,performance,for-loop,optimization,biopython,Python,Performance,For Loop,Optimization,Biopython,我一直坚持使用这个脚本,如果您能帮助我输入您的内容,那就太好了。我的问题是,我认为脚本没有那么有效——它需要很多时间才能结束运行 我有一个fasta文件,其中包含大约9000个序列行,示例如下,我的脚本所做的是: 读取第一行忽略以>开头的行,并生成6个字符块 将这些6mer添加到列表中 对之前的6个列表2进行反向补充 如果行中没有反向补码6,则保存行。 然后转到文件中的下一行,检查它是否包含列表2中的任何反向补码6mer。如果是,它将丢弃它。如果没有,它将保存该行,并将新行的所有反向补码6-me

我一直坚持使用这个脚本,如果您能帮助我输入您的内容,那就太好了。我的问题是,我认为脚本没有那么有效——它需要很多时间才能结束运行

我有一个fasta文件,其中包含大约9000个序列行,示例如下,我的脚本所做的是:

读取第一行忽略以>开头的行,并生成6个字符块 将这些6mer添加到列表中 对之前的6个列表2进行反向补充 如果行中没有反向补码6,则保存行。 然后转到文件中的下一行,检查它是否包含列表2中的任何反向补码6mer。如果是,它将丢弃它。如果没有,它将保存该行,并将新行的所有反向补码6-mers读取到列表2中-除了已经存在的反向补码6-mers之外。 我的档案:

>seq1
TCAGATGTGTATAAGAGACAGTTATTAGCCGGTTCCAGGTATGCAGTATGAGAA
>seq2
TCAGATGTGTATAAGAGACAGCGCCTTAATGTTGTCAGATGTCGAAGGTTAGAA
>seq3
TCAGATGTGTATAAGAGACAGTGTTACAGCGAGTGTTATTCCCAAGTTGAGGAA
>seq4
TCAGATGTGTATAAGAGACAGTTACCTGGCTGCAATATGGTTTTAGAGGACGAA
这是我的代码:

import sys
from Bio import SeqIO
from Bio.Seq import Seq

def hetero_dimerization():
    script = sys.argv[0]
    file1 = sys.argv[1]
    list = []
    list2 = []
    with open(file1, 'r') as file:
        for record in SeqIO.parse(file, 'fasta'):
            for i in range(len(record.seq)):
                kmer = str(record.seq[i:i + 6])
                if len(kmer) == 6:
                    list.append(kmer)
            #print(record.seq)
            #print(list)

            for kmers in list:
                C_kmer = Seq(kmers).complement()
                list2.append(C_kmer[::-1])
            #print(list2)

            cnt=0
            if any(items in record.seq for items in list2):
                cnt +=1

            if cnt == 0:
                print('>'+record.id)
                print(record.seq)
                
if __name__ == '__main__':
    hetero_dimerization()

如果您能帮助我使这段代码非常高效和快速地工作,那就太好了。谢谢。

如果我没有弄错,您可以在内部for循环之外调用.complete。这也会去掉第一个列表

def异质二聚化: file1=sys.argv[1] 列表2=[] 使用openfile1,“r”作为文件: 对于SeqIO.parsefile“fasta”中的记录: 补码=记录。顺序。补码 对于我的补充: kmer=strcomplement[i:i+6] 如果lenkmer==6: 清单2.appendkmer[:-1] cnt=0 如果record.seq中的任何项目与列表2中的项目相同: cnt+=1 如果cnt==0: 打印“>”+记录.id printrecord.seq
在我的机器上,这一更改将运行时间从20秒减少到了0.5秒左右——对于一个大约500个序列的小样本来说。

这将是一个很好的选择,因为今天早些时候你没有问同样的问题吗?-正如@C.Nivs所指出的,如果您有工作代码并且正在寻求改进,那么codereview将是发布的更好地方。请务必阅读CooDeVIEW问题指南。哦,在将来,而不是重提一个问题,考虑提供一个。悬赏可能有助于吸引更多的注意力和更多的答案。如果9000场比赛中只有100张记录,那么我的想法就行不通了。这就是说,我们没有您的数据,在您的用例中,优化很可能取决于数据的统计数据,因此我得出结论,您是自己的,换句话说:只有您可以根据数据对代码进行基准测试。。。