【发布时间】:2021-06-14 22:46:39
【问题描述】:
我坚持使用这个脚本,如果您能帮助我输入您的信息,那就太好了。我的问题是我认为脚本效率不高——结束运行需要很长时间。
我有一个包含大约 9000 个序列行的 fasta 文件(下面的示例),我的脚本的作用是:
- 读取第一行(忽略以
>开头的行)并生成 6mers(6 个字符块) - 将这些 6mer 添加到列表中
- 对之前的 6mer (list2) 进行反向补码
- 如果行中没有反向补码 6mer,则保存行。
- 然后转到文件的下一行,检查它是否包含任何反向补码 6mer(在 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()
如果您能帮助我使这段代码变得非常高效和快速运行,那就太好了 - 谢谢。
【问题讨论】:
-
这将是codereview 的良好候选者
-
你今天早些时候不是问过同样的问题吗?
-
Every question is urgent to the one asking it - 正如@C.Nivs 所指出的,如果您有工作代码并且您正在寻找改进,codereview 将是更好的发布地点。请务必阅读 codereview 问题指南。
-
哦,以后不要再转发问题,而是考虑提供bounty。引用:“赏金可能有助于吸引更多关注和更多答案”。
-
如果只有 100 条记录超过 9000 条匹配,那么我的想法将行不通。也就是说,我们没有您的数据,并且在您的用例中,优化很可能取决于数据的统计信息,因此我得出结论,您只能靠自己,换句话说:只有您可以进行基准测试您的数据上的代码...
标签: python performance for-loop optimization biopython