Python多处理编辑距离计算

时间:2013-07-16 12:28:51

标签: python multiprocessing bioinformatics

我只编程了大约一年,所以非常了解基础知识,但我很难理解python多处理文档。如果有人可以指出我正确的方向来解决手头的问题,那就太好了。

我正在使用python-Levenshtein c-模块来计算大量DNA序列(~5000-2000)之间的成对距离,并希望使用多处理来加快速度。我的问题的基本版本的伪代码如下:

def edit_distance(seqA, seqB):
    ...
    return distance

sequence_list = [seq1, seq2, ... seq10000]
results_dict = {}    

centroid = sequence_list[0]
results_dict[centroid] = {}
for target in sequence_list[1:]:
    results_dict[centroid][target] = edit_distance(centroid, target)

完全实现后,将使用每个seq作为质心来执行。如果有人能指出哪种方法最适合多处理sequence_list [1:]中所有目标的距离,那将会很棒。感谢。

1 个答案:

答案 0 :(得分:1)

直接获得代码的多处理版本:

from functools import partial
from multiprocessing import Pool

def dist_mp(centroid, target):
    return target, edit_distance(centroid, target)

def main():
    # ...
    pool = Pool() # use all CPUs
    for target, d in pool.imap_unordered(partial(dist_mp, centroid),
                                         sequence_list[1:]):
        results_dict[centroid][target] = d
    pool.close()
    pool.join()

if __name__ == "__main__":
    main()

如果edit_distance()函数释放GIL,那么您可以使用线程而不是进程:

from multiprocessing.dummy import Pool # use threads

注意:如果您使用时间复杂度更高的算法,可能会获得更好的时间性能(避免在“完全实现”的情况下调用edit_distance()函数O(n**2)次),而不仅仅是通过使用多处理的常数因子。