К сожалению, ваш код не будет работать таким образом.Многопроцессорное порождение отдельных процессов , что означает, что пространство памяти разделено !Изменения, сделанные одним подпроцессом, не будут отражены в других процессах или ваших родительских процессах.
Строго говоря, это не ограниченная проблема.Область действия - это нечто, определенное внутри одного процесса интерпретатора.
Модуль предоставляет средства совместного использования памяти между процессами , но это обходится дорого (общая память работает медленнее из-за проблем с блокировкой и тому подобного)..
Теперь у numpy есть приятная особенность: он освобождает GIL во время вычисления . Это означает, что использование multi threading
вместо multiprocessing
должно дать вамнекоторые преимущества с небольшими другими изменениями в вашем коде, просто замените import multiprocessing
на import threading
и multiprocessing.Process
на threading.Thread
. Код должен дать правильный результат. На моей машине удаляются операторы печати и код sleep
он запускается менее чем за 8 секунд:
Multiprocessing: 7.48570203781
[[1.000e+00 1.000e+00 2.000e+00 ... 3.999e+03 4.000e+03 4.000e+03]
[0.000e+00 2.000e+00 2.000e+00 ... 4.000e+03 4.000e+03 4.001e+03]
[0.000e+00 0.000e+00 3.000e+00 ... 4.000e+03 4.001e+03 4.001e+03]
...
[0.000e+00 0.000e+00 0.000e+00 ... 7.998e+03 7.998e+03 7.999e+03]
[0.000e+00 0.000e+00 0.000e+00 ... 0.000e+00 7.999e+03 7.999e+03]
[0.000e+00 0.000e+00 0.000e+00 ... 0.000e+00 0.000e+00 8.000e+03]]
В качестве альтернативы можно указать, что ваши подпроцессы возвращают результат, а затем объединяют результаты в основном процессе.