如何更改 for 循环以高效工作 python
How to change for loop to work efficiently python
我一直坚持使用这个脚本,如果你能帮助我提供意见就太好了。我的问题是我认为脚本效率不高 - 结束需要很多时间 运行.
我有一个包含大约 9000 条序列线的 fasta 文件(如下例),我的脚本所做的是:
- 读取第一行(忽略以
>
开头的行)并生成 6mers(6 个字符块)
- 将这些 6mers 添加到列表中
- 对之前的 6mers (list2) 进行反向互补
- 如果没有反向互补 6mers 在行中,则保存该行。
- 然后转到文件的下一行,检查它是否包含任何反向互补 6mers(在 list2 中)。如果是,它将丢弃它。如果没有,它保存该行,并将新的所有反向互补 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 循环之外。这也摆脱了第一个列表。
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 个序列的相当小的样本。
我一直坚持使用这个脚本,如果你能帮助我提供意见就太好了。我的问题是我认为脚本效率不高 - 结束需要很多时间 运行.
我有一个包含大约 9000 条序列线的 fasta 文件(如下例),我的脚本所做的是:
- 读取第一行(忽略以
>
开头的行)并生成 6mers(6 个字符块) - 将这些 6mers 添加到列表中
- 对之前的 6mers (list2) 进行反向互补
- 如果没有反向互补 6mers 在行中,则保存该行。
- 然后转到文件的下一行,检查它是否包含任何反向互补 6mers(在 list2 中)。如果是,它将丢弃它。如果没有,它保存该行,并将新的所有反向互补 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 循环之外。这也摆脱了第一个列表。
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 个序列的相当小的样本。