0

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

我正在使用 python-Levenshtein c-module 来计算大量 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:] 中所有目标的距离计算,那就太好了。谢谢。

4

1 回答 1

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)时间)而不是仅通过使用多处理以恒定因子改进它,您可能会获得更好的时间性能。

于 2013-07-16T13:17:24.033 回答