Python多处理不加速

时间:2017-10-23 23:17:15

标签: python python-multiprocessing pathos

我有一个代码,其中函数调用更改了共享资源。到目前为止,对于每个输入向量(维度rxc的输入矩阵),我是串行运行的。

我想用每个函数调用更改共享资源(比如R)。到目前为止,我已尝试使用Python Multiprocessing和Pathos Multiprocessing来加快速度。我甚至试过np.apply_along_axis试图加快速度。

到目前为止,我注意到的是串行处理是最快的方式。我迷失了为什么会发生这种情况。

我尝试了以下方法

  1. np.apply_along_axis:只有轻微延迟(恒定时移)
  2. Pathos.multiprocessing.ProcessingPool.Map:最多延迟10倍
  3. multiprocessing.Process(手动拆分):最多5x延迟
  4. multiprocessing.Pool:符合Pathos结果。
  5. 我是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)
    

0 个答案:

没有答案