Различия в производительности между OSX и Linux для связи с использованием многопроцессорности Python
Я пытался узнать больше о модуле 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, что кажется более ожидаемым.
Ответы
Ответ 1
Ну, когда мы говорим о мультипроцессе с питоном, это происходит:
- ОС выполняет все многозадачные работы
- Единственный вариант для многоядерного параллелизма
- Дублирование использования системных ресурсов
Существуют огромные различия между osx и linux. и osx основан на Unix и обрабатывает многозадачный процесс иначе, чем linux.
Установка Unix требует строгого и четко определенного аппаратного обеспечения и работает только на определенных процессорах, и, возможно, osx не предназначен для ускорения процессов python. Эта причина может быть причиной.
Для получения дополнительной информации вы можете прочитать документацию MultiProcessing.
Я надеюсь, что это помогает.