我正在尝试使用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万个点,我需要处理多年的数据。
答案 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()
我没有使用共享内存队列,因为我的所有进程都彼此独立。