2013-07-16 3 views
0

저는 약 1 년 동안 프로그래밍을 해왔으므로 기본 지식을 잘 알고 있습니다.하지만 파이썬 다중 처리 문서를 고민하기 위해 고심하고 있습니다. 누군가가 문제의 올바른 방향을 지적 해 줄 수 있다면 좋을 것입니다.파이썬 멀티 프로세싱 편집 거리 계산

저는 파이썬 -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) 

은 중심으로 각각의 서열을 사용하여 수행됩니다. sequence_list [1 :]에서 모든 대상에 대한 거리 계산을 다중 처리하는 것이 가장 좋은 방법을 지적 할 수 있다면 좋을 것입니다. 감사. edit_distance() 기능 GIL를 출시

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() 

경우에 당신이 스레드 대신 프로세스를 사용할 수 있습니다 :

답변

1

코드의 버전을 멀티 프로세싱 얻을 간단

from multiprocessing.dummy import Pool # use threads 

참고 : 당신은 더 나은 시간을 얻을 수 있습니다 ("완전히 구현 된 경우"O(n**2) 번 함수를 edit_distance() 번 호출하지 말고) multiproce를 사용하여 상수 요소를 개선하는 대신 싱.

+0

감사합니다. 이것은 나를 위해 작동하지만 실제로는 단일 프로세스보다 10 배 더 오래 걸립니다. 거대한 속도 저하를 일으키는 새로운 프로세스를 만드는 데 상당한 오버 헤드가 발생할 수 있다고 가정합니다. 재 : 시간 복잡성, 나는 이미 시간 절약 단계를 구현했다. 그러나 나는 이것을 포괄 할 수있는 비교가 필요하다. – edm

+0

@edm : 모든 프로세스는'Pool()'에 의해 생성됩니다. 나는'sequence_list'가 작고'edit_distance()'가 무시할 수있는 시간 (이 경우에 새로 생성하는 대신에 풀을 재사용)이 없으면 새로운 프로세스를 만드는 데 시간차가 있다는 것을 의심합니다. 주 프로세스와 작업자 (예 :'zip() '또는'sequence_list' 인덱스를 사용) 사이에 불필요한'target' 복사를 제거하거나'imap()'에 대해 다른'chunksize' 인수를 시도 할 수 있습니다. – jfs

관련 문제