blosum62 是 276 个项目的字典。
我更喜欢用缺少的项目来完成,因为它代表了只有 276 轮的迭代,而要分析的序列可能有超过 276 个元素。因此,如果您在函数 score_match() 的帮助下找到每对的分数,则该函数必须对 if pair not in matrix
序列的每个元素执行测试,也就是说肯定远远超过 276 次。
另一件需要花费大量时间的事情:每个都score += something
创建一个新整数并将名称分数绑定到这个新对象。每个绑定花费的时间量是由生成器立即添加到当前数量的整数流所不存在的。
from Bio.SubsMat.MatrixInfo import blosum62 as blosum
from itertools import izip
blosum.update(((b,a),val) for (a,b),val in blosum.items())
def score_pairwise(seq1, seq2, matrix, gap_s, gap_e, gap = True):
for A,B in izip(seq1, seq2):
diag = ('-'==A) or ('-'==B)
yield (gap_e if gap else gap_s) if diag else matrix[(A,B)]
gap = diag
seq1 = 'PAVKDLGAEG-ASDKGT--SHVVY----------TI-QLASTFE'
seq2 = 'PAVEDLGATG-ANDKGT--LYNIYARNTEGHPRSTV-QLGSTFE'
print sum(score_pairwise(seq1, seq2, blosum, -5, -1))
这个 score_pairwise() 是一个生成器函数,因为有yield而不是return。
编辑:Python 3 的更新代码:
from Bio.SubsMat.MatrixInfo import blosum62 as blosum
blosum.update(((b,a),val) for (a,b),val in list(blosum.items()))
def score_pairwise(seq1, seq2, matrix, gap_s, gap_e, gap = True):
for A,B in zip(seq1, seq2):
diag = ('-'==A) or ('-'==B)
yield (gap_e if gap else gap_s) if diag else matrix[(A,B)]
gap = diag
seq1 = 'PAVKDLGAEG-ASDKGT--SHVVY----------TI-QLASTFE'
seq2 = 'PAVEDLGATG-ANDKGT--LYNIYARNTEGHPRSTV-QLGSTFE'
print(sum(score_pairwise(seq1, seq2, blosum, -5, -1)))