2010-12-16 5 views
11

파이썬에서는 multiprocessing 모듈을 사용하여 일련의 값에 대해 병렬로 함수를 실행할 수 있습니다. 예를 들어, 이것은 f의 첫 번째 100000 평가 목록을 작성합니다.파이썬 멀티 프로세싱 여러 입력을 가진 함수

def f(i): 
    return i * i 

def main(): 
    import multiprocessing 
    pool = multiprocessing.Pool(2) 
    ans = pool.map(f, range(100000)) 

    return ans 

f가 여러 입력을 사용하지만 하나의 변수 만 달라지는 경우에도 비슷한 작업을 수행 할 수 있습니까? 예를 들어,이 병렬 얼마나 :

def f(i, n): 
    return i * i + 2*n 

def main(): 
    ans = [] 
    for i in range(100000): 
     ans.append(f(i, 20)) 

    return ans 

답변

11

이렇게하는 방법에는 여러 가지가 있습니다. 질문에 주어진 예에서, 당신은 단지 래퍼 함수

def g(i): 
    return f(i, 20) 

을 정의 할 수 있고 map()이 래퍼를 전달합니다. lambda tup: f(*tup) : 더 일반적인 접근 방식은 여러 인수

def g(tup): 
    return f(*tup) 

또는 동등한 람다 표현식을 사용하여 튜플을 하나의 튜플 인수를 받아서 압축을 풉니 다 래퍼를하는 것입니다.

-3

당신은 가난한 사람의 태닝을 사용할 수 있습니다 (일명 그것을 포장) :

new_f = lambda x: f(x, 20) 

다음 new_f(i)를 호출합니다.

+3

Thils는 "가져 오기 가능"하지 않은 기능 (피클 도구 사용)을 지원하지 않으므로 멀티 프로세싱 맵과 함께 * 사용하지 않습니다 * – Lagerbaer

21

당신은 당신이 여러 인수를 풀을 얻을 수 pathos라는 multiprocessing 내 포크를 사용하는 경우 ... functools.partial

def f(i, n): 
    return i * i + 2*n 

def main(): 
    import multiprocessing 
    pool = multiprocessing.Pool(2) 
    ans = pool.map(functools.partial(f, n=20), range(100000)) 

    return ans 
3

을 사용하고 또한 lambda 기능을 수행 할 수 있습니다. 그것에 대한 좋은 점은 병렬로 작업 할 수 있도록 프로그래밍 구문을 변경할 필요가 없다는 것입니다.

>>> def f(i, n): 
... return i * i + 2*n 
... 
>>> from itertools import repeat 
>>> N = 10000 
>>> 
>>> from pathos.pools import ProcessPool as Pool 
>>> pool = Pool() 
>>> 
>>> ans = pool.map(f, xrange(1000), repeat(20)) 
>>> ans[:10] 
[40, 41, 44, 49, 56, 65, 76, 89, 104, 121] 
>>> 
>>> # this also works 
>>> ans = pool.map(lambda x: f(x, 20), xrange(1000)) 
>>> ans[:10] 
[40, 41, 44, 49, 56, 65, 76, 89, 104, 121] 
관련 문제