Чтобы точно знать причину замедления, вы должны измерить сколько времени занимает все, а с многопроцессорной обработкой и многопоточностью это может быть сложно.
Такто, что следует, мое лучшее предположение. Чтобы многопроцессорная обработка работала, родительский процесс должен передать данные, использованные в вычислениях, рабочим процессам. Время, которое требуется, зависит от объема данных. Перенос матрицы 2 ^ 14 x 2 ^ 14, вероятно, займет значительное время. Я подозреваю, что эта передача данных занимает дополнительное время.
Если вы используете операционную систему, которая использует fork
startmethod для multiprocessing
/ concurrent.futures
, , есть способвокруг этой передачи данных . Этими операционными системами являются, например, Linux, * BSD и macOS (но не ms-windows).
В вышеупомянутых операционных системах многопроцессорная обработка использует системный вызов fork
для создания своих рабочих. Этот системный вызов создает копию родительского процесса в качестве дочернего процесса. Поэтому, если вы создадите векторы и матрицы до , создав ProcessPoolExecutor
, рабочие унаследуют эти данные. Это не очень дорогая или трудоемкая операция, потому что все эти ОС используют копирование при записи для управления страницами памяти. Пока исходная матрица не изменена, все программы, использующие ее, читают с одних и тех же страниц памяти. Это наследование данных означает, что вам не нужно явно передавать данные работнику. Вам просто нужно передать небольшую структуру данных, в которой указано, с какими диапазонами индексов должен работать работник.
К сожалению, из-за технических ограничений платформы это не работает в ms-windows. То, что вы могли бы сделать в ms-windows, - это сохранить исходные двоичные файлы с матричной и векторной памятью перед созданием Executor
. Если вы пометите эти сопоставления именем, рабочие процессы должны иметь возможность отображать те же данные в свою память без необходимости их переноса. Я думаю, можно ли поручить numpy
использовать такой необработанный двоичный массив без его воссоздания.
На обеих платформах вы можете использовать одну и ту же технику для «отправки данных» родительскому процессу;сохраните данные в общей памяти и верните имя файла или тэг родительскому процессу.