Я попытался распараллелить цикл for в Python с помощью пакета multiprocessing. Функция, которую я хочу запустить в нескольких потоках, - это
def regression_loss(W, k, x, y):
U = expit(x.dot(W[k].T)) - y
return np.sum(U*U)
который вычисляет ошибку задачи регрессии с несколькими классами для нескольких точек данных x
. W
— весовая матрица, а y
— цель.
В настоящее время парализованный цикл for примерно в 200 раз медленнее. Я хотел бы знать, почему и что я могу сделать, чтобы сделать параллельный цикл for намного быстрее, чем цикл for seriell.
Вот мой код, где я сравниваю стандартный цикл for и распараллеленный с использованием модуля многопроцессорности.
import time
import numpy as np
import multiprocessing as mp
from scipy.special import expit
def regression_loss(W, k, x, y):
U = expit(x.dot(W[k].T)) - y
return np.sum(U*U)
def optimizer_seriell(p_size, n_classes, n_input, batch_size, W):
loss = np.zeros((p_size))
x, y = np.random.rand(batch_size, n_input), np.random.rand(batch_size, n_classes)
for k in range(p_size):
loss[k] = regression_loss(W, k, x, y)
def optimizer_parallel(p_size, n_classes, n_input, batch_size, W):
pool = mp.Pool(processes = 4)
x, y = np.random.rand(batch_size, n_input), np.random.rand(batch_size, n_classes)
loss = [pool.apply(regression_loss, args=(W, k, x, y)) for k in range(p_size)]
if __name__ == "__main__":
p_size = 32
n_classes = 10
n_input = 1000
batch_size = 8
W = [np.random.rand(n_classes, n_input) for k in range(p_size)]
t0 = time.time()
optimizer_seriell(p_size, n_classes, n_input, batch_size, W)
print(time.time()-t0) # 0.00186 on my machine
t0 = time.time()
optimizer_parallel(p_size, n_classes, n_input, batch_size, W)
print(time.time()-t0) # 0.20029 on my machine