2017-10-19 5 views
0

그래서 두 개의 인수 만 사용하여 여러 .txt 파일에 몇 가지 작업을 수행하는 함수가 있습니다. 현재 의도 된대로 작동하지만 약 1 시간 만에 10 % 정도의 물건을 가져 왔습니다. 따라서 .txt 파일이 상당히 크기 때문에 시간이 걸립니다.두 개의 인수가있는 함수의 다중 처리 (풀)

이제는 패키지 다중 처리 및 특히이 풀 세그먼트에 대해 읽었습니다. 그러나, 나는 그것을 어떻게 올바르게 사용하는지 잘 모르겠습니다. 그래서

structures = [1, 3, 6, 7, 8, 10, 13, 25, 27] 

다음 structures 다른 값의 목록, 예를 들면 인 반면의 structure_path는 항상 동일

for k, structure in enumerate(structures): 
    structure_maker(structure_path, structure) 

:

내 기능을 실행하는 데 사용하는 코드는 다음과 같다 이것에 대해 Pool 프로세스를 사용하면 어떻게 될까요? 는 지금까지 내가 읽을 수있는 내가 좋아하는 뭔가를 할 필요가 :

from multiprocessing import Pool 

mypool = Pool(6) # Choosing how many cores I want to use 
mypool.map(structure_maker, list) 

을 내가 길을 잃지 곳 list입니다. 그게 뭐야? structures 목록, 그렇다면 어디에 넣어야합니까? structure_path?

답변

1

Pool.map() 기능처럼 작동 내장 map() 기능을 수행, 즉 그것은 두 번째 인수로 전달 반복 가능의 항목의 각각에 대한 인수로 전달하는 기능을 적용합니다. 제공된 함수를 호출 할 때마다 iterable의 다음 항목을 단일 인수로 함수에 제공합니다.

이 경우 잠재적 인 문제는 사용하려는 함수에 structure_maker()이 두 개의 인수가 필요하다는 것입니다. 이 경우에는 여러 가지 방법이 있지만이 경우 인수 중 하나가 항상 동일하기 때문에 functools.partial() 함수를 사용하여 두 번째 인수 만 전달하면되는 임시 함수를 만들 수 있습니다. 그러면 할 수 있습니다 mypool.map() 전화에서 바로 여기

는 I의 의미는 다음과 같습니다

from multiprocessing import Pool 

def structure_maker(structure_path, structure): 
    """ Dummy for testing. """ 
    return structure_path, structure 

if __name__ == '__main__': 

    from pprint import pprint 
    from functools import partial 

    mypool = Pool(4) 
    structure_path = 'samething' 
    structures = [1, 3, 6, 7, 8, 10, 13, 25, 27] 
    results = mypool.map(partial(structure_maker, structure_path), structures) 
    pprint(results) 

출력 :

[('samething', 1), 
('samething', 3), 
('samething', 6), 
('samething', 7), 
('samething', 8), 
('samething', 10), 
('samething', 13), 
('samething', 25), 
('samething', 27)] 
0

tuple을 만들고 압축을 풀어야 할 수도 있습니다.

def structure_maker_proxy(args): 
    structure_path, structure = args 
    structure_maker(structure_path, structure) 


from multiprocessing import Pool 

mypool = Pool(6) # Choosing how many cores I want to use 

lis = [(structure_path, struct) for struct in structures] 
mypool.map(structure_maker_proxy, lis)