我尝试使用多处理程序包使Python中的for循环并行化。我想在多个线程上运行的功能就是这个
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循环比seriell for循环快得多。
这是我的代码,其中我比较了使用多处理模块的标准for循环和并行化的循环。
import time
import numpy as np
import multiprocessing as mp
from scipy.special import expit
def regression_loss(W,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,y)
def optimizer_parallel(p_size,W):
pool = mp.Pool(processes = 4)
x,n_classes)
loss = [pool.apply(regression_loss,args=(W,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,W)
print(time.time()-t0) # 0.00186 on my machine
t0 = time.time()
optimizer_parallel(p_size,W)
print(time.time()-t0) # 0.20029 on my machine