2016-09-29 1 views
-1

간단한 멀티 프로세싱 테스트를하고 있는데 뭔가 이상한 것처럼 보입니다. 임 터보 부스트와 함께 i5 - 6200U 2.3 GHz에서 이것을 실행합니다.파이썬 다중 처리 - 실행 시간이 늘어났습니다. 무엇을 잘못 했습니까?

from multiprocessing import Process, Queue 
import time 

def multiply(a,b,que): #add a argument to function for assigning a queue 
    que.put(a*b) #we're putting return value into queue 

if __name__ == '__main__': 
    queue1 = Queue() #create a queue object 
    jobs = [] 
    start_time = time.time() 
#####PARALLEL#################################### 
    for i in range(0,400): 
     p = p = Process(target= multiply, args= (5,i,queue1)) 
     jobs.append(p) 
     p.start() 

    for j in jobs: 
     j.join() 

    print("PARALLEL %s seconds ---" % (time.time() - start_time)) 
#####SERIAL################################ 
    start_time = time.time() 
    for i in range(0,400): 
     multiply(5,i,queue1) 
    print("SERIAL %s seconds ---" % (time.time() - start_time)) 

출력 :

PARALLEL 22.12951421737671 seconds --- 
SERIAL 0.004009723663330078 seconds --- 

도움이 많이 감사합니다.

+3

프로세스를 생성하는 것은 두 개의 작은 정수를 곱하는 것보다 훨씬 비쌉니다. CPU를 사용하는 것보다 훨씬 더 많은 프로세스를 생성합니다 (모든 프로세스가 제한된 CPU주기 동안 서로 경쟁합니다). 속도 향상을 확인하려면 각 작업자 프로세스에서 수행되는 "유용한 작업"이 중요합니다 (프로세스 생성 + 파괴 및 IPC (프로세스 간 통신) 오버 헤드보다 많은 시간이 필요합니다). –

+0

왜 400 개의 프로세스를 만들고 곱하기 값을 대기열에 저장합니까? – haifzhan

+0

그럼 어떻게하면 되겠습니까? 당신은 나를 올바른 자원으로 안내 할 수 있습니까? 수영장이나 다른 것을 사용해야합니까? 나는 정말로 혼란 스럽다. 큐의 값을 저장해야 할 필요가 있습니다. 프로세스의 결과를 얻고, 인터넷 검색을 통해 큐를 처리하는 것처럼 보입니다. – RandN88

답변

0

다음은 멋진 속도 향상을 얻는 간단한 (바보 같은) 코드의 예입니다. 주석에서 이미 다루었 듯이 프로세스의 불합리한 수를 생성하지는 않으며 프로세스 간 통신 오버 헤드에 비해 원격 함수 호출 당 수행되는 작업이 많습니다.

import multiprocessing as mp 
import time 

def factor(n): 
    for i in range(n): 
     pass 
    return n 

if __name__ == "__main__": 
    ns = range(100000, 110000) 

    s = time.time() 
    p = mp.Pool(4) 
    got = p.map(factor, ns) 
    print(time.time() - s) 
    assert got == list(ns) 

    s = time.time() 
    got = [factor(n) for n in ns] 
    print(time.time() - s) 
    assert got == list(ns) 
+0

고마워요! 이것은 많은 도움이됩니다. 그러나 n 대신 2D 배열 (이미지와 같은)을 어떻게 전달합니까? 그것은 내가 꽤 혼란스러워하는 한 부분입니다. 그리고 가치를 되 찾으려면 여전히 대기열을 사용해야합니까? – RandN88

+0

코드를 보시면 'factor()'의 결과가 표시됩니다. 2D 배열 (이미지와 같은)이 무엇을 의미하는지 정확히 알지 못합니다. "2D 배열"과 "이미지"는 파이썬 유형에 내장되어 있지 않습니다. 세부 사항이 중요합니다. 간단히 말해서 절임 될 수있는 모든 것이 전달되거나 반환 될 수 있습니다. –

+0

감사의 말 Tim,이 점이 많이 도움이됩니다. :) – RandN88

관련 문제