使用biopython快速计算对齐的相同位点的百分比
我开发了以下代码来计算路线中相同站点的数量。不幸的是,代码很慢,我必须在数百个文件上迭代,处理1000多个对齐需要将近12个小时,这意味着速度快十倍是合适的。如有任何帮助,将不胜感激:使用biopython快速计算对齐的相同位点的百分比,python,bioinformatics,biopython,Python,Bioinformatics,Biopython,我开发了以下代码来计算路线中相同站点的数量。不幸的是,代码很慢,我必须在数百个文件上迭代,处理1000多个对齐需要将近12个小时,这意味着速度快十倍是合适的。如有任何帮助,将不胜感激: import os from Bio import SeqIO from Bio.Seq import Seq from Bio import AlignIO from Bio.SeqRecord import SeqRecord from Bio.Alphabet import generic_dna from
import os
from Bio import SeqIO
from Bio.Seq import Seq
from Bio import AlignIO
from Bio.SeqRecord import SeqRecord
from Bio.Alphabet import generic_dna
from Bio.Align import MultipleSeqAlignment
import time
a = SeqRecord(Seq("CCAAGCTGAATCAGCTGGCGGAGTCACTGAAACTGGAGCACCAGTTCCTAAGAGTTCCTTTCGAGCACTACAAGAAGACGATTCGCGCGAACCACCGCAT", generic_dna), id="Alpha")
b = SeqRecord(Seq("CGAAGCTGACTCAGTGGGCGGAGTCACTGAAACTGGAGCACCAGTTCCTCAGAGTCCCCTTCGAGCACTACAAGAAGACAATTCGTGCGAACCACCGCAT", generic_dna), id="Beta")
c = SeqRecord(Seq("CGAAGCTGACTCAGTTGGCAGAATCACTGAAACTGGAGCACCAGTTCCTCAGAGTCCCCTTCGAGCACTACAAGAAGACGATTCGTGCGAACCACCGCAT", generic_dna), id="Gamma")
d = SeqRecord(Seq("CGAAGCTGACTCAGTTGGCAGAGTCACTGAAACTGGAGCACCAGTTCCTCAGAGTCCCCTTCGAGCACTACAAGAAGACGATTCGTGCGAACCACCGCAT", generic_dna), id="Delta")
e = SeqRecord(Seq("CGAAGCTGACTCAGTTGGCGGAGTCACTGAAACTGGAGCACCAGTTCCTCAGAGTCCCCTTCGAGCACTACAAGAAGACGATTCGTGCGAACCACCGCAT", generic_dna), id="Epsilon")
align = MultipleSeqAlignment([a, b, c], annotations={"tool": "demo"})
start_time = time.time()
if len(align) != 1:
for n in range(0,len(align[0])):
n=0
i=0
while n<len(align[0]): #part that needs to be faster
column = align[:,n]
if (column == len(column) * column[0]) == True:
i=i+1
n=n+1
match = float(i)
length = float(n)
global_identity = 100*(float(match/length))
print(global_identity)
print("--- %s seconds ---" % (time.time() - start_time))
导入操作系统
来自Bio import SeqIO
从生物序列导入序列
从Bio导入AlignIO
从Bio.SeqRecord导入SeqRecord
从Bio.Alphabet导入通用\u dna
从Bio.Align导入多重对齐
导入时间
a=序列记录(序列(“CCAGCTGAATCAGCTGGGCGGAGTCACTGAACTGGAGACCAGTTCCTAAGGTTCTCGAGCTACAGAGAGAGACGATTCAGCGCGAACCGCAT”,通用型),id=“阿尔法”)
b=序列记录(序列(“CGAAGCTGATCAGTGGCGGAGTCAACTGAACTGGAGACCAGTTCCTCAGAGTCCCTTCGAGACTACAGAGAGAGATCGTGCGAACCAGATCGCGAGATCGCGAGATCGAGATCGCGAGATCGAGATCGA”,通用型),id=“Beta”)
c=序列记录(序列(“CGAAGCTGATCAGCTTGGCAGCATCACTGAACTGGAGACCAGTTCCTCAGAGTCCCTTCGAGACTACAGAGAGATCGTGCGAACCAGCATCGATTCAGATCGTGCGCGAACCGCAT”,通用,id=“伽马”)
d=SeqRecord(Seq(“CGAAGCTGATCAGCTTGGCAGCAGTCAGAGACTGAACTGGAGACCAGTTCCTCACAGAGTCCCTTCGAGACTACAGAGAGATCGTGCGCGAACCGCAT”,通用),id=“Delta”)
e=SeqRecord(Seq(“CGAAGCTGATCAGTTCAGTTGGCGGAGTCACTGAACTGGAGACCAGTTCCTCAGAGTCCCTTCGAGACTACAGAGAGATCGTGCGAACCGCAT”,通用型),id=“Epsilon”)
align=MultipleSeqAlignment([a,b,c],注解={“工具”:“演示”})
开始时间=time.time()
如果透镜(对齐)!=1:
对于范围(0,len(align[0])中的n:
n=0
i=0
而
那么,您要检查5个字符串中的每个字符串在列中是否具有相同的字符?如果列中的字符都匹配,则递增i
,否则递增n
你对代码的解释是正确的
基于以上,我建议使用以下代码作为更快的替代方案
我假设align
是这样一种结构:
align = [
'AGCTCGCGGAGGCGCTGCT....',
'ACCTCGGAGGGCTGCTGTAC...',
'AGCTCGGAGGGCTGCTGTAC...',
# possibly more ...
]
我们尝试检测其中相同字符的列。上面,第一列是AAA
(匹配),下一列是GCG
(不匹配)
更简短的版本:
def compute_match(aligned_sequences):
match_count = sum(1 for chars in zip(*aligned_sequences) if all_equal(chars))
total = len(aligned_sequences[0])
mismatch_count = total - match_count # Obviously.
return ...
您是否测量过,代码的哪一部分需要这么长的时间来处理?如果是MultipleSeqAlignment
计算,则无法提供多少信息。如果下面是你的循环,那就不同了。align
列表有多长?文件已经对齐,上面代码中的对齐仅用于再现性目的。这就是说,耗时最长的部分是:“虽然nI有一个约1600个对齐的文件夹,但此代码需要约12小时来计算相同站点的百分比。对齐中的数据形状是什么?”?在align[0]
中,align
的形状是5个100字符的字符串,而align[0]
的形状基本上是一列,每个字符串由一个字符组成(5个字符,每个字符串/序列一个字符)。希望我能理解你的问题,谢谢你的帮助:)。再快一点吗?谢谢!在本例中,使用您的代码,时间从0.101566076279秒
减少到0.000661849975586秒
。一旦我执行了你的代码,纸条检查1600个文件的总时间从12小时
减少到18.1031439304秒
。我希望结果仍然是正确的!:)我的意思是,手动/目视检查一些结果,以防万一。我看不到真实的数据,无法很好地测试。我对照旧的运行进行了检查,结果是正确的ヽ(´▽`)/
def compute_match(aligned_sequences):
match_count = sum(1 for chars in zip(*aligned_sequences) if all_equal(chars))
total = len(aligned_sequences[0])
mismatch_count = total - match_count # Obviously.
return ...