저는 파이썬의 multiprocessing
모듈에 대해 더 자세히 배우고 프로세스 간 통신을위한 다양한 기술을 평가하려고했습니다. 프로세스간에 numpy
배열을 전송할 때 Pipe
, Queue
및 Array
(모두 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의 성능 차이를 해결합니다. 우리는 파이썬으로 멀티 과정에 대해 이야기 할 때
'Value'와'Array' 타입은 데이터 안전성을 보장하기 위해'Lock'에 의존합니다. 잠금을 획득하는 것은 커널 모드로 전환해야하므로 상당히 비싼 작업입니다. 한편, 간단한 데이터 구조를 직렬화하는 것은 현대 CPU가 대부분하는 시간이므로 비용이 상당히 적습니다. 'Array'에서'Lock'을 제거하면 더 나은 성능을 보여 주지만 데이터에 대한 경쟁 조건을 제외 할 수는 없습니다. – noxdafox
@noxdafox 전체 벤치 마크 코드를 보면 벤치 마크의'Array' 부분에 대한 잠금을 실제로 사용하지 않는다는 것을 알 수 있습니다. 그리고이 경우조차도 리눅스에서의'Array'의 성능 저하를 설명 할뿐입니다. 그러나 리눅스와 OSX 간의 불일치를 반드시 설명하지는 않습니다. – ddavella
귀하의 맥북 솔리드 스테이트 드라이브가 귀하의 리눅스 노트북 회전 디스크가 있습니까? – Hannu