2013-07-16 77 views
0

我只编程了大约一年,所以非常了解基础知识,但我正在努力让我的头脑围绕着python多处理文档。如果有人能为我们手头的问题指出正确的方向,那将是非常棒的。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) 

一旦得到全面落实,这将使用每个序列为重心进行。如果有人能指出哪种方法最适合多次处理sequence_list [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)时间),而不是仅使用多处理器通过常数因子改善性能ssing。

+0

谢谢。这适用于我,但实际上比单个过程要长10倍。我认为可能会产生相当大的开销,造成新的进程导致大量减速?回复:时间复杂度,我已经实施了一些节省时间的步骤,但我需要比较详尽,所以我可以采取多少措施是有限的。 – edm

+0

@edm:所有进程都由'Pool()'创建。我怀疑这个时间差是由于创建新的进程所致,除非'sequence_list'很小,'edit_distance()'的时间可以忽略不计(在这种情况下,重用池而不是创建一个新池)。你可以尝试消除主进程和工作人员之间不必要的'target'拷贝(例如,使用'zip()'或者传递'sequence_list'索引)和/或为'imap()'尝试不同的'chunksize'参数。 – jfs