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 .