2017-01-30 1 views
5

두 개의 인수를 취하여 multiprocessing.Pool에 추가하고 병렬화 할 수있는 함수를 작성하려고합니다. 이 간단한 함수를 작성할 때 몇 가지 문제가있었습니다.파이썬 : 맵 및 다중 처리 사용

df = pd.DataFrame() 
df['ind'] = [111, 222, 333, 444, 555, 666, 777, 888] 
df['ind1'] = [111, 444, 222, 555, 777, 333, 666, 777] 

def mult(elem1, elem2): 
    return elem1 * elem2 

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    print(pool.map(mult, df.ind.astype(int).values.tolist(), df.ind1.astype(int).values.tolist())) 
    pool.terminate() 

오류를 반환 것 :

TypeError: unsupported operand type(s) for //: 'int' and 'list' 

내가 잘못 이해 할 수 없다. 누구든지이 오류의 의미와 해결 방법을 설명 할 수 있습니까?

답변

6

다중 프로세스 풀 모듈은 다중 처리 할 인수 목록을 가져와 하나의 인수 만 지원합니다. 당신은 다음을 수행하여이 문제를 해결할 수 있습니다

from multiprocessing import Pool 
import pandas as pd 

df = pd.DataFrame() 
df['ind'] = [111, 222, 333, 444, 555, 666, 777, 888] 
df['ind1'] = [111, 444, 222, 555, 777, 333, 666, 777] 

def mult(elements): 
    elem1,elem2 = elements 
    return elem1 * elem2 

if __name__ == '__main__': 
    pool = Pool(processes=4) 
    inputs = zip(df.ind.astype(int).values.tolist(), df.ind1.astype(int).values.tolist()) 
    print(pool.map(mult, inputs)) 
    pool.terminate() 

내가 여기했던 당신이 입력으로 원하는 두 개의 인수되는 각 요소 목록으로이 반복 가능 객체를 압축 무엇. 자, 함수의 입력을 변경하여 처리 할 수 ​​있도록 인수를 푸십시오.

+0

테스트 케이스를 설치하는 것이 좋습니다. 내부적으로'pandas'가 GIL을 피하고 C 언어로 처리 할 수 ​​없습니까? 풀 만들기와 오버 헤드를 조정하는 것이 이것이 OP의 어려움을 수정 함에도 불구하고 현명하지 못한 접근이라는 것을 의미합니까? – roganjosh

+0

나는 Pandas에서 적절하게 입력을 만들어 더 잘 확장 할 수있는 방법이있을 것이라고 확신합니다. 오버 헤드가가는 한, 아마도 특정 애플리케이션 일 것이기 때문에 대답하기가 어려울 것입니다. 솔직하게 말하면, 멀티 프로세싱을 사용하는 데있어서 약간 새로운 것이므로 귀하의 질문에 대한 최선의 대답을 알 수 없을 것이라고 생각합니다. 그러나, 나는 OP가 가지고있는 특정한 문제점에 부딪쳤다. – tmwilson26

+0

나는 오늘 밤 내 자신의 테스트 케이스를 얻을 수 없을지 모르지만 나는 조사 할 것이다. 다중 프로세스는 프로세스 생성에 커다란 오버 헤드를 가지고 있으며,이 접근 방식을 무효화 할 때까지 간단하게 벡터화 할 수 있다는 것을 알고 있습니다. 당신이 깔끔하게 질문에 대답하기 때문에 나는 upvoted, 나는 단지 접근의 전제가 결함이 있다고 생각하지만, 스스로 학습 :) – roganjosh