Различия в производительности между 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.

Я надеюсь, что это помогает.