我只编程了大约一年,所以非常了解基础知识,但我很难理解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:]中所有目标的距离,那将会很棒。感谢。
答案 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)
次),而不仅仅是通过使用多处理的常数因子。