我有一个代码,其中函数调用更改了共享资源。到目前为止,对于每个输入向量(维度rxc的输入矩阵),我是串行运行的。
我想用每个函数调用更改共享资源(比如R)。到目前为止,我已尝试使用Python Multiprocessing和Pathos Multiprocessing来加快速度。我甚至试过np.apply_along_axis试图加快速度。
到目前为止,我注意到的是串行处理是最快的方式。我迷失了为什么会发生这种情况。
我尝试了以下方法
我是python并行编程的新手,可能做错了。做这件事的好方法是什么?
更新:自行整理地图代码
我在引用我正在做的事情。
class SOM(object):
def __init__(self, X):
pool = Pool()
pool.ncpus=4
self.map = pool.map
def train_single( self, x, lr, r):
b = np.argmin(np.linalg.norm(self.W-x, axis=1))
N = np.where(np.linalg.norm(self.Y-self.Y[b],axis=1)<r)[0]
d = np.linalg.norm(self.Y[N]-self.Y[b],axis=1)
H = np.array([np.exp(-d**2/np.max(d)**2*0.5)]).T
H/=H.max()
gradients = - (self.W[N] - x) * H * lr
if np.isnan(gradients).any():
return
#
self.W[N] += gradients
def train_batch_parallel(self, X):
self.W = np.random.random(size=(100, X.shape[1]))
self.Y = np.array([[i, j] for i in range(10) for j in range(10)])
self.X = X
r = 10
lr = .5
self.rs = np.repeat(r, X.shape[0]).astype(float)
self.lrs = np.repeat(lr, X.shape[0])
for k in range(1, 100):
self.rs *=0.8# np.append(self.rs, np.repeat(r * 0.8 ** k, X.shape[0]), axis=0)
self.lrs *=0.9# np.append(self.rs, np.repeat(lr * 0.9 ** k, X.shape[0]), axis=0)
#parallel execution using the pool.map
self.map(self.train_single, X, self.lrs, self.rs)