Python,multiprocessing.pool与for循环花费的时间大致相同

时间:2018-11-08 21:21:46

标签: python multiprocessing

我正在尝试使用python处理来自多个数据站的一些大型数据集。我的想法是使用multiprocessing.pool从单个工作站分配数据给每个CPU,因为每个工作站的数据彼此独立。

但是,与单for循环相比,我的计算时间似乎并没有真正减少。

这是我的代码的一部分:

<input type='number' name='items_quantity_discount[]' min='1' class='form-control' v-model='voucher_item.item_discount_value_input' min='1' max=''/>

我不使用块大小,因为cum_dd接受所有先前数据^ 2的总和。实际上,我将数据分成10个相等的部分,因为进程之间没有通信。我想知道我是否错过了这里。

我的数据每天每个站点有200万个点,我需要处理多年的数据。

3 个答案:

答案 0 :(得分:1)

NumPy已经在CPU和GPU上实现了高效的并行处理。处理算法使用单指令多数据(SIMD)指令。

通过手动合并计算,会降低效率。您可以通过向量化显式for循环来提高性能。

有关视频化的更多信息,请参见下面的视频。

https://www.youtube.com/watch?v=qsIrQi0fzbY

如果您遇到困难,我会在附近寻求更新或帮助。祝你好运!

答案 1 :(得分:1)

这不能直接解决您的多处理问题,但是(如Ugur MULUK和Iguananaut所述),我认为您的get_cumdd函数效率低下。 Numpy提供{{3}}。重新实现您的功能对于包含10k元素的数组,我获得了超过1000倍的加速。使用10万个元素,速度提高了大约7000倍。有了2M元素,我就不介意完成它。

# your function
def cum_dd(data):
    #if not isinstance(data, list):
    #    data = [data]
    dd = np.zeros((len(data),1))
    cum_dd = np.zeros((len(data),1))
    for i in range(len(data)):
        dd[i] = data[i]**2
        cum_dd[i]=np.sum(dd[0:i])
    return cum_dd

# numpy implementation
def cum_dd2(data):
    # adding an axis to match the shape of the output of your cum_dd function
    return np.cumsum(data**2)[:, np.newaxis]

对于2e6点,此实现在我的计算机上花费〜11ms。我认为单个站点10年的数据大约需要30秒。

答案 2 :(得分:0)

非常感谢所有评论和答案!应用矢量化和合并后,我将计算时间从一小时减少到3秒(10 * 170万个数据点)。如果有人有兴趣,我这里有我的代码,

def get_cumdd(data):
    #if not isinstance(data, list):
    #    data = [data]
    dd = np.zeros((len(data),1))
    for i in range(len(data)):
        dd[i] = data[i]**2
    cum_dd=np.cumsum(dd)
    return dd,cum_dd

if __name__ == '__main__':
    n_proc = np.min([mp.cpu_count(),nstation])
    p = mp.Pool(processes=int(n_proc))       
    result = p.map(CC.get_cumdd,d)
    p.close()
    p.join()

我没有使用共享内存队列,因为我的所有进程都彼此独立。