2013-10-02 4 views
3

저는 파이썬에 처음 접했고 현재 다중 처리를 찾고 있습니다. 단일 처리보다 다중 처리를 사용하는 것이 더 빠를 것이라고 가정 한 간단한 예제를 만들었지 만, 실제로는 느려집니다. 이 스크립트는 0에서 999까지의 정수를 가진 목록을 작성하고 실행하며,이를 작업자 프로세스가 실행되는 짧은 목록으로 분할하여 "나는 [worker] [integer]"를 인쇄합니다. 일반적인 실행 시간은 appr입니다. 26 초, 단일 프로세스 스크립트는 0.5-1 초 빠릅니다. 다중 처리 스크립트가 느린 특별한 이유가 있습니까? 아니면 멀티 프로세싱에 사용하는 것이 나쁜 예입니까? 두 스크립트 코드는 참조 아래다중 처리 성능 대 단일 처리

멀티 코드입니다 :

import multiprocessing 
from datetime import datetime 

def f(x): 
    listagain=[] 
    for i in x: 
     listagain.append("I am worker " + str(i)) 
    return listagain  

def chunks(l, n): 
    """ Yield successive n-sized chunks from l. 
    """ 
    lister=[] 
    for i in xrange(0, len(l), n): 
     lister.append(l[i:i+n]) 
    return lister 

if __name__ == '__main__': 
    startTime=datetime.now() 
    Pool=multiprocessing.Pool 
    mylist=list(xrange(10000)) 
    size=10 
    listlist=[] 
    listlist=chunks(mylist,size) 
    workers=4 
    pool=Pool(processes=workers) 
    result=pool.map(f,listlist) 
    pool.close() 
    pool.join() 
    print result 
    print (datetime.now()-startTime) 

단일 처리 코드 : 소비되는 시간보다 아마도 더 높은 multiprocessing와 연관된 오버 헤드가 있습니다

from datetime import datetime 

def f(x): 
    listagain=[] 
    for i in x: 
     for j in xrange(0,len(i)): 
      listagain.append("I am worker " + str(i[j])) 
    return listagain 

def chunks(l, n): 
    """ Yield successive n-sized chunks from l. 
    """ 
    lister=[] 
    for i in xrange(0, len(l), n): 
     lister.append(l[i:i+n]) 
    return lister 

if __name__ == '__main__': 
    startTime=datetime.now() 
    mylist=list(xrange(10000)) 
    size=10 
    listlist=[] 
    listlist=chunks(mylist,size) 
    result=f(listlist) 
    print result 
    print (datetime.now()-startTime) 
+0

@Saullo는 멀티 프로세싱에서 오버 헤드가있을뿐만 아니라 여러 하드웨어 프로세서가 문제에 대해 병렬로 작업 할 수 있도록 허용하는 경우 시간을 절약 할 수 있다고 말했습니다. 코어가 2 개 밖에없는 경우 스레드 수에 관계없이 최대 2 배까지 얻을 수 있습니다. 또한 입출력에주의하십시오. 인쇄하는 데 90 %의 시간이 소요된다면 병렬 처리로 인한 속도 향상은 실제로 나머지 10 %에서만 작동합니다. –

+1

'map()'은 선택적인'chunksize' 인자를 가지고 있습니다 - 직접리스트를 나눌 필요는 없습니다. –

답변

3

문제의 단일 작업에 대해서는 더 큰 작업이있는 경우이 오버 헤드 (일반적으로 피클 링 개체와 관련됨)는 비례하여 작아지며 다중 처리를 사용하면 유리할 것입니다.

+0

감사합니다. 당신이 단 하나의 작업을 말할 때 처음부터 끝까지 작업자 프로세스를 의미합니까? 또한 궁극적으로 수천 개의 CSV 파일이있는 폴더를 통해 실행하고 각 파일에서 일부 데이터를 가져 와서 새 파일을 만드는 것이 내 목표입니다. 큰 파일을 요구하는 다중 처리 질문을 보았지만 여러 파일은 거의 묻지 않았습니다. 이것은 오버 헤드와 관련이 있습니까? 즉 대용량 파일의 작업은 일반적으로 더 오래 걸리므로 다중 처리가 더 좋습니다. – TTNor

+0

@ user2840117 여러 개의'csv' 파일에 대해 파일에서로드 된 모든 문자열을 전달하지 않으면'다중 처리 '를 이용할 수 있습니다. 파일 이름이나 파일 객체 만 전달하면 피클로드에 드는 비용은 아마도 적을 것이고'다중 처리 '를 사용하여 이득을 보게 될 것입니다. 팁은 프로세스를 생성 할 때 큰 오브젝트를 덤핑 및로드하는 것을 피하기위한 것입니다 .... –