微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何更改for循环以有效地工作python

如何解决如何更改for循环以有效地工作python

我一直坚持使用这个脚本,如果您能帮助我输入您的信息,那就太好了。我的问题是我认为脚本效率不高 - 结束运行需要很多时间。

我有一个包含大约 9000 个序列行的 fasta 文件(下面的示例),我的脚本的作用是:

  1. 读取第一行(忽略以 > 开头的行)并生成 6mers(6 个字符块)
  2. 将这些 6mer 添加到列表中
  3. 对之前的 6mers (list2) 进行反向补充
  4. 如果行中没有反向互补 6mer,则保存该行。
  5. 然后转到文件中的下一行,并检查它是否包含任何反向补码 6mer(在列表 2 中)。如果是,它会丢弃它。如果没有,它会保存该行,并将新的所有反向互补 6-mers 读入 list2 - 除了已经存在的反向互补 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()

如果您能帮助我使此代码非常高效且快速运行,那就太好了 - 谢谢。

解决方法

如果我没记错的话,您可以将 .complement() 调用拉到内部 for for 循环之外。这也摆脱了第一个列表。

def hetero_dimerization():
    file1 = sys.argv[1]
    list2 = []
    with open(file1,'r') as file:
        for record in SeqIO.parse(file,'fasta'):

            complement = record.seq.complement()
            for i in range(len(complement)):
                kmer = str(complement[i:i + 6])
                if len(kmer) == 6:
                    list2.append(kmer[::-1])

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

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

此更改将我机器上的运行时间从 20 秒减少到大约 0.5 秒 - 对于大约 500 个序列的相当小样本。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。