blosum62是一个包含276个项的字典。
我更喜欢补全缺失的项,因为它只需要进行276次迭代,而被分析的序列很可能有超过276个元素。因此,如果您使用函数score_match()查找每对的分数,该函数将不得不为序列的每个元素执行测试if pair not in matrix
,也就是说肯定比276次多得多。
另一个耗费大量时间的事情是:每个score += something
都会创建一个新的整数并将名称score绑定到这个新对象上。每个绑定都需要一定的时间,而通过生成器产生的整数流则可以立即添加到当前量中而无需进行绑定操作。
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))
因为使用了yield而非return,所以score_pairwise()是一个生成器函数。
编辑:更新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)))