Я хочу рассчитать подобие между входной последовательностью и коротким фрагментом из последовательности. Результатом является матрица подобия с каждой позицией, являющейся оценкой выравнивания. Работает, но, к сожалению, медленно. Как я мог реализовать цикл более эффективно в python и numpy? Я также думаю использовать MPI, но многопоточность или даже лучшее внутреннее решение numpy было бы полезно. Ниже приведен код.Biopython для матрицы подобия - ищет лучшую производительность
from Bio import pairwise2
import numpy
....
similarityMatrix = numpy.zeros(shape=(sequenceLength-fragmentLength,sequenceLength-fragmentLength))
for i in xrange(sequenceLength-fragmentLength):
currentFragment = sequence[i:i+fragmentLength]
for j in xrange(i,sequenceLength-fragmentLength):
aFragment = sequence[j:j+fragmentLength]
alns = pairwise2.align.globalds(aFragment, currentFragment, matrix, gap_open, gap_extend)
bestHit = alns[0]
score = bestHit[2]
similarityMatrix[i,j] = float(score)
similarityMatrix[j,i] = float(score)
Что вы действительно делаете, это локальное выравнивание. Для этого вам нужен алгоритм Смита-Уотермана. – wasserfeder
Я хотел бы помочь, но я не понял, чего вы пытаетесь достичь. В любом случае, ваш код может принести много пользы от использования pypy. Попробуйте, вам ничего не нужно менять. Если вам нужна дополнительная помощь, пожалуйста, обновите свой вопрос на примере. – tbrittoborges
@ wasserfeder. Да, это локальное выравнивание, и меня интересует матрица, а не результат выравнивания. Но в Biopython у меня не была функция, возвращающая матрицу, поэтому я решил сгенерировать ее сам ... –