blosum62は276アイテムの辞書です。
分析対象のシーケンスには276を超える要素が含まれている可能性が高いのに対し、これは276ターンの反復のみを表すため、不足している項目で完了することを好みました。したがって、関数score_match()を使用して各ペアのスコアを見つけると、この関数は if pair not in matrix
シーケンスの各要素に対してテストを実行する必要があります。つまり、確かに276回をはるかに超えます。
時間がかかるもう1つのことは、それぞれが新しい整数を作成し、名前スコアをこの新しいオブジェクトに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()は、returnの代わりにyieldがあるため、ジェネレーター関数です。
編集: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)))