코드의 총 실행 시간에 큰 영향을주지 않습니다 pool.imap_unordered
대신 pool.imap
의 사용. 조금 더 빠를 수도 있지만 너무 많이하지는 않습니다.
그러나 할 수있는 일은 반복에서 사용할 수있는 값 사이의 간격을 더 균등하게 만드는 것입니다. 즉, 예를 들어 일관된 시간 (0.01
초)이 아닌 매우 다른 시간이 걸릴 수있는 작업이있는 경우 imap_unordered
은 느리게 계산 된 값보다 빠르게 계산 된 값을 산출하여 작업을 부드럽게 처리 할 수 있습니다. 정규 imap
은 더 빠른 것보다 더 느린 것을 계산할 때까지 더 빠른 것을 산출하는 것을 지연 할 것입니다 (그러나 이것은 더 많은 계산으로 이동하는 작업자 프로세스를 지연시키지 않습니다.
i*0.1
초 동안 작업 기능을 잠시 멈추고 입력 목록을 섞은 다음 루프에 i
을 인쇄 해보십시오. 두 개의 imap
버전의 차이점을 확인할 수 있습니다. 여기 내 버전합니다 (main
기능과 if __name__ == '__main__'
보일러는 Windows에서 제대로 실행하는 데 필요한되었다)입니다 : 49 같은 값 (4.9 초 복용) 처리하는 동안
from multiprocessing import Pool
import time
import random
def work(i):
time.sleep(0.1*i)
return i
def main():
p = Pool(4)
nums = range(50)
random.shuffle(nums)
start = time.time()
print 'Using imap'
for i in p.imap(work, nums):
print i
print 'Time elapsed: %s' % (time.time() - start)
start = time.time()
print 'Using imap_unordered'
for i in p.imap_unordered(work, nums):
print i
print 'Time elapsed: %s' % (time.time() - start)
if __name__ == "__main__":
main()
imap
버전은 다음 긴 일시 정지를해야합니다 그것 (우리가 49가 처리되기를 기다리는 동안 다른 프로세스에 의해 계산 된) 다른 값들로 날아갈 것입니다. 대조적으로, imap_unordered
루프는 대개 한 번에 거의 오랫동안 멈추지 않습니다. 빈도는 높아지지만 일시 중지가 짧아지고 결과물이 더 매끄러 워지는 경향이 있습니다.
이 예에서 '0 ** 2'에 필요한 시간의 차이는 '49 ** 2'와 차이가 없습니다. 나는 어떤 계산이 다른 것들보다 훨씬 더 오랜 시간이 걸리면 어떤 일이 일어날 지 궁금하다. 이런 경우에는'imap_unordered'가 더 빠를까요? –
@CTZhu 그렇게 생각합니다. – satoru