Я пытаюсь распараллелить for loop
, чтобы ускорить мой код, поскольку все операции циклической обработки независимы.После онлайновых руководств кажется, что стандартная библиотека multiprocessing
в Python - хорошее начало, и я начал работать с базовыми примерами.
Однако для моего реального случая использования я обнаружил, что параллельная обработка (использование двухъядерного компьютера) на самом деле немного (<5%) медленнее, когда работает на Windows.Выполнение того же кода в Linux, однако, приводит к увеличению скорости параллельной обработки на ~ 25% по сравнению с последовательным выполнением. </p>
Из документации я считаю, что это может быть связано с отсутствием в Windows функции fork ()Это означает, что каждый раз процесс должен быть инициализирован заново.Тем не менее, я не совсем понимаю это и задаюсь вопросом, может ли кто-нибудь подтвердить это, пожалуйста?
В частности,
-> Означает ли это, что весь код в вызывающем файле Python запускается для каждогопараллельный процесс в Windows, даже инициализация классов и импорт пакетов?
-> Если это так, можно ли этого избежать, если каким-то образом передать копию (например, с помощью глубокой копии) класса в новые процессы?
-> Существуют ли какие-либо советы / другие стратегиидля эффективного распараллеливания дизайна кода как для Unix, так и для Windows.
Мой точный код длинный и использует много файлов, поэтому я создал пример структуры в стиле псевдокода, которая, как мы надеемся, покажет проблему.
# Imports
from my_package import MyClass
imports many other packages / functions
# Initialization (instantiate class and call slow functions that get it ready for processing)
my_class = Class()
my_class.set_up(input1=1, input2=2)
# Define main processing function to be used in loop
def calculation(_input_data):
# Perform some functions on _input_data
......
# Call method of instantiate class to act on data
return my_class.class_func(_input_data)
input_data = np.linspace(0, 1, 50)
output_data = np.zeros_like(input_data)
# For Loop (SERIAL implementation)
for i, x in enumerate(input_data):
output_data[i] = calculation(x)
# PARALLEL implementation (this doesn't work well!)
with multiprocessing.Pool(processes=4) as pool:
results = pool.map_async(calculation, input_data)
results.wait()
output_data = results.get()
РЕДАКТИРОВАТЬ: Я не считаю, что вопрос является дубликатом предложенного, поскольку это относится к разнице в Windows и Linunx, которая вообще не упоминается в предложенном дублирующем вопросе.