Я пытался узнать больше о модуле multiprocessing
Python и оценить различные методы связи между процессами. Я написал тест, который сравнивает производительность Pipe
, Queue
и Array
(все из multiprocessing
) для передачи массивов numpy
между процессами. Полный бенчмарк можно найти здесь. Вот фрагмент теста для Queue
:
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
Я проверил этот тест на своем ноутбуке Linux и получил следующие результаты для размера массива 1000000:
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) на Macbook и получил следующие результаты:
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
Реальные разницы во времени не удивительны, поскольку, разумеется, разные системы будут отличаться высокой производительностью. Что так удивительно, различие в относительных сроках.
Что могло бы объяснить это? Это довольно удивительный результат для меня. Я бы не удивился, увидев такие резкие различия между Linux и Windows, или OSX и Windows, но я вроде бы предполагал, что эти вещи будут вести себя очень точно между OSX и Linux.
Этот вопрос касается различий производительности между Windows и OSX, что кажется более ожидаемым.