python - 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万个点,我需要处理多年的数据。
解决方案
非常感谢所有的评论和回答!应用矢量化和池化后,我将计算时间从 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()
我没有使用共享内存队列,因为我的所有进程都是相互独立的。
推荐阅读
- xpath - 如何使用 importXML 将结果限制为 1
- visual-studio - 如何按名称或名称或扩展名的一部分在 TFS 中查找文件
- django - 如果已经检测到值,如何控制 for 循环?
- java - Spring REST Docs 配置不起作用 - java.lang.IllegalStateException
- android - 不明白这个 Lambda 函数是如何工作的
- python-3.x - Tkinter 在循环中创建多个按钮并更改单击按钮的文本
- embedded - 在“NVM_ReadAll”期间启动时检测到“NVM_E_INTEGRITY_FAILED”错误
- django - Django 设置.py
- windows-10 - Windows 10 无法连接到 Ubuntu 16.04 samba
- python - Python脚本保存/复制到特定目录