2013-09-28 2 views
11

imap_unordered의 반환 된 반복자의 결과 순서는 임의적이며 imap (다음 코드에서 확인)보다 빨리 실행되지 않는 것 같습니다. 그렇다면이 방법을 사용하는 이유는 무엇입니까?어떤 상황에서`multiprocessing.Pool.imap_unordered`를 사용해야합니까?

from multiprocessing import Pool 
import time 

def square(i): 
    time.sleep(0.01) 
    return i ** 2 

p = Pool(4) 
nums = range(50) 

start = time.time() 
print 'Using imap' 
for i in p.imap(square, nums): 
    pass 
print 'Time elapsed: %s' % (time.time() - start) 

start = time.time() 
print 'Using imap_unordered' 
for i in p.imap_unordered(square, nums): 
    pass 
print 'Time elapsed: %s' % (time.time() - start) 
+0

이 예에서 '0 ** 2'에 필요한 시간의 차이는 '49 ** 2'와 차이가 없습니다. 나는 어떤 계산이 다른 것들보다 훨씬 더 오랜 시간이 걸리면 어떤 일이 일어날 지 궁금하다. 이런 경우에는'imap_unordered'가 더 빠를까요? –

+0

@CTZhu 그렇게 생각합니다. – satoru

답변

21

코드의 총 실행 시간에 큰 영향을주지 않습니다 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

jup입니다. 완료된 작업에 대한 진행률 막대를 표시합니다. –

3

imap_unordered 또한 imap보다 시간이 지남에 따라 메모리를 적게 사용하는 것 같습니다. 적어도 그것은 수백만 가지 이상의 반복자에서 경험 한 것입니다.

+0

그것은 사용되기 전에 완료된만큼 많은 항목을 유지할 필요가 없기 때문입니다. –

관련 문제