저는 파이썬에 처음 접했고 현재 다중 처리를 찾고 있습니다. 단일 처리보다 다중 처리를 사용하는 것이 더 빠를 것이라고 가정 한 간단한 예제를 만들었지 만, 실제로는 느려집니다. 이 스크립트는 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)
@Saullo는 멀티 프로세싱에서 오버 헤드가있을뿐만 아니라 여러 하드웨어 프로세서가 문제에 대해 병렬로 작업 할 수 있도록 허용하는 경우 시간을 절약 할 수 있다고 말했습니다. 코어가 2 개 밖에없는 경우 스레드 수에 관계없이 최대 2 배까지 얻을 수 있습니다. 또한 입출력에주의하십시오. 인쇄하는 데 90 %의 시간이 소요된다면 병렬 처리로 인한 속도 향상은 실제로 나머지 10 %에서만 작동합니다. –
'map()'은 선택적인'chunksize' 인자를 가지고 있습니다 - 직접리스트를 나눌 필요는 없습니다. –