2017-12-19 57 views
13

저는 파이썬의 multiprocessing 모듈에 대해 더 자세히 배우고 프로세스 간 통신을위한 다양한 기술을 평가하려고했습니다. 프로세스간에 numpy 배열을 전송할 때 Pipe, QueueArray (모두 multiprocessing)의 성능을 비교하는 벤치 마크를 작성했습니다. 전체 벤치 마크는 here입니다.파이썬 멀티 프로세싱을 사용하는 통신을위한 OSX와 리눅스의 성능 불일치

def process_with_queue(input_queue, output_queue): 
    source = input_queue.get() 
    dest = source**2 
    output_queue.put(dest) 


def test_with_queue(size): 

    source = np.random.random(size) 

    input_queue = Queue() 
    output_queue = Queue() 

    p = Process(target=process_with_queue, args=(input_queue, output_queue)) 
    start = timer() 
    p.start() 
    input_queue.put(source) 
    result = output_queue.get() 
    end = timer() 

    np.testing.assert_allclose(source**2, result) 

    return end - start 

내 리눅스 노트북에이 테스트를 실행하고 백만의 배열 크기에 대한 다음과 같은 결과를 얻었다 : 여기 Queue에 대한 테스트의 조각입니다

Using mp.Array: time for 20 iters: total=2.4869s, avg=0.12435s 
Using mp.Queue: time for 20 iters: total=0.6583s, avg=0.032915s 
Using mp.Pipe: time for 20 iters: total=0.63691s, avg=0.031845s 

내가보고 조금 놀랐습니다 Array은 공유 메모리를 사용하고 피클 링을 필요로하지 않으므로 성능이 떨어 지므로 제어 할 수없는 부분이 numpy에 있다고 가정합니다.

그러나, 나는 다음과 같은 결과를 맥북에 (배열 크기 1000000에 대한 다시) 동일한 테스트를 실행하고 있어요 :

Using mp.Array: time for 20 iters: total=1.6917s, avg=0.084587s 
Using mp.Queue: time for 20 iters: total=2.3478s, avg=0.11739s 
Using mp.Pipe: time for 20 iters: total=8.7709s, avg=0.43855s 

진짜 타이밍 차이가있는 것은 놀라운 일이 아니다 물론 다른 시스템 것이기 때문에 성능이 다릅니다. 어떤 입니다. 그래서 놀라운 타이밍의 차이가 있습니다.

이 문제를 어떻게 설명 할 수 있습니까? 이것은 나에게 꽤 놀라운 결과입니다. 리눅스와 윈도우, 또는 OSX와 윈도우 사이의 그러한 뚜렷한 차이를 보아도 놀라지 않을 것이다. 그러나 나는 이런 것들이 OSX와 리눅스 사이에서 매우 유사하게 행동 할 것이라고 생각했다.

This question은 Windows와 OSX의 성능 차이를 해결합니다. 우리는 파이썬으로 멀티 과정에 대해 이야기 할 때

+0

'Value'와'Array' 타입은 데이터 안전성을 보장하기 위해'Lock'에 의존합니다. 잠금을 획득하는 것은 커널 모드로 전환해야하므로 상당히 비싼 작업입니다. 한편, 간단한 데이터 구조를 직렬화하는 것은 현대 CPU가 대부분하는 시간이므로 비용이 상당히 적습니다. 'Array'에서'Lock'을 제거하면 더 나은 성능을 보여 주지만 데이터에 대한 경쟁 조건을 제외 할 수는 없습니다. – noxdafox

+0

@noxdafox 전체 벤치 마크 코드를 보면 벤치 마크의'Array' 부분에 대한 잠금을 실제로 사용하지 않는다는 것을 알 수 있습니다. 그리고이 경우조차도 리눅스에서의'Array'의 성능 저하를 설명 할뿐입니다. 그러나 리눅스와 OSX 간의 불일치를 반드시 설명하지는 않습니다. – ddavella

+1

귀하의 맥북 솔리드 스테이트 드라이브가 귀하의 리눅스 노트북 회전 디스크가 있습니까? – Hannu

답변

0

음, 이런 일이 발생합니다

  • OS는 모든 멀티 태스킹 작업을 수행
  • 멀티 코어 동시성
  • 중복 사용에 대한 유일한 옵션 시스템 자원의

osx와 리눅스 사이에는 큰 차이가 있습니다. osx는 Unix를 기반으로하고 Linux와 다른 방식으로 멀티 태스킹 프로세스를 처리합니다.

유닉스 설치에는 엄격하고 잘 정의 된 하드웨어 기계 장치가 필요하며 특정 CPU 기계에서만 작동하며, 아마도 osx는 파이썬 프로세스 속도를 높이기 위해 설계되지 않았습니다. 이러한 이유가 원인 일 수 있습니다.

자세한 내용은 MultiProcessing 설명서를 참조하십시오.

도움이되기를 바랍니다.