使用biopython快速计算对齐的相同位点的百分比

使用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

我开发了以下代码来计算路线中相同站点的数量。不幸的是,代码很慢,我必须在数百个文件上迭代,处理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 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 ...