Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Biopython相似矩阵-寻找更好的性能_Python_Numpy_Biopython - Fatal编程技术网

Biopython相似矩阵-寻找更好的性能

Biopython相似矩阵-寻找更好的性能,python,numpy,biopython,Python,Numpy,Biopython,我想计算输入序列和序列中的短片段之间的相似性。结果是一个相似矩阵,每个位置都是对齐的分数。 它可以工作,但不幸的是速度很慢。如何在python和numpy中更有效地实现循环?我也在考虑使用MPI,但多线程甚至更好的内部numpy解决方案将是有益的。下面是代码 from Bio import pairwise2 import numpy .... similarityMatrix = numpy.zeros(shape=(sequenceLength-fragmentLength,sequen

我想计算输入序列和序列中的短片段之间的相似性。结果是一个相似矩阵,每个位置都是对齐的分数。 它可以工作,但不幸的是速度很慢。如何在python和numpy中更有效地实现循环?我也在考虑使用MPI,但多线程甚至更好的内部numpy解决方案将是有益的。下面是代码

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))