Biopython相似矩阵-寻找更好的性能
我想计算输入序列和序列中的短片段之间的相似性。结果是一个相似矩阵,每个位置都是对齐的分数。 它可以工作,但不幸的是速度很慢。如何在python和numpy中更有效地实现循环?我也在考虑使用MPI,但多线程甚至更好的内部numpy解决方案将是有益的。下面是代码Biopython相似矩阵-寻找更好的性能,python,numpy,biopython,Python,Numpy,Biopython,我想计算输入序列和序列中的短片段之间的相似性。结果是一个相似矩阵,每个位置都是对齐的分数。 它可以工作,但不幸的是速度很慢。如何在python和numpy中更有效地实现循环?我也在考虑使用MPI,但多线程甚至更好的内部numpy解决方案将是有益的。下面是代码 from Bio import pairwise2 import numpy .... similarityMatrix = numpy.zeros(shape=(sequenceLength-fragmentLength,sequen
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)
首先,我将尝试只计算对角线的一半,从
I
点的内环开始,并避免计算以前的路线:
for i in range(full_size - frag_size):
curr_frag = seq[i:i + frag_size]
# ADD THIS ----vvvvv------------vvv
for j in range(i + 1, full_size + 1 - frag_size):
match_frag = seq[j:j + frag_size]
# Do the following calculation here
另一件事可能是只计算分数,但我觉得这是太小的改进。请执行以下操作:
score = pairwise2.align.globalds(aFragment,
currentFragment,
matrix,
gap_open,
gap_extend,
score_only=True) # <= ADD THIS
但你不会得到任何表现。正如他们所说:
提供矢量化功能主要是为了方便,而不是为了性能。该实现本质上是一个for循环
您真正做的是局部对齐。为此,你需要史密斯-沃特曼算法。我很想帮你,但我不明白你想实现什么。无论如何,您的代码可以从使用pypy中受益匪浅。试试看,你不需要改变任何东西。如果您需要更多帮助,请用一个例子更新您的问题。@wasserfeder。是的,这是局部校准,我对矩阵感兴趣,而不是校准结果。但在Biopython中,我没有返回矩阵的函数,因此我想自己生成它……是的,在发布原始问题后,我将代码更改为nxn/2。我将研究globalds函数,谢谢你的提示。我正在添加你要求的
numpy
,但除了“美丽胜于丑陋”之外,它没有任何用处。同时将一些用于循环。
def chop(sequence, frag_size):
for i in range(full_size - frag_size):
yield sequence[i + 1:i + 1 + frag_size]
def pairwise(seq1, seq2):
return pairwise2.align.globalds(
seq1, seq2, MATRIX, -2, -1, score_only=True)
query = numpy.array([x for x in chop(seq, frag_size)])
subject = numpy.array([x for x in chop(seq, frag_size)])
vfunc = numpy.vectorize(pairwise)
results = []
for i in subject:
results.append(vfunc(i, query))