首页 > 解决方案 > Python,multiprocessing.pool 与 for 循环花费的时间大致相同

问题描述

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

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

这是我的代码的一部分:

#function calculating the square of each data point, and taking the cumulative sum
def get_cumdd(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=np.cumsum(dd)
    return cum_dd

#parallelization between each station 
if __name__ == '__main__':
    n_proc = np.min([mp.cpu_count(),nstation]) #nstation = 10
    p = mp.Pool(processes=int(n_proc)) 
    result = p.map(get_cumdd,data)
    p.close()
    p.join()
cum_dd = np.zeros((nstation,len(data[0])))
for i in range(nstation):
    cum_dd[i] = result[i].T 

我不使用块大小,因为 cum_dd 采用所有先前数据的总和^2。我基本上将我的数据分成 10 个相等的部分,因为进程之间没有通信。我想知道我是否在这里遗漏了什么。

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

标签: pythonmultiprocessing

解决方案


非常感谢所有的评论和回答!应用矢量化和池化后,我将计算时间从 1 小时减少到 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()

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


推荐阅读