我只编程了大约一年,所以对基础知识非常了解,但我很难理解python多处理文档。如果有人能为我指出解决眼前问题的正确方向,那就太好了。
我正在使用python Levenstein 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:]中所有目标的距离计算,那就太好了。谢谢
获取代码的多处理版本很简单:
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)
次),而不是通过使用多处理将其提高一个常数,则可能会获得更好的时间性能。