我所拥有的功能可以在1秒内循环10,000次。但是,我需要执行数十亿到数亿次的此功能。正如预期的那样,由于使用CPU的开销,使用带有4个内核的本地multiprocessing
软件包会将10k循环减慢到1.5秒。使用multiprocessing
中的chunksize参数帮助琐碎。有没有办法让多个进程以超过开销的速度调用此函数?
功能的截断版本:
rands = np.random.random((200, 1000000))
def randfunc(i):
Q = np.concatenate([rands[:,[i]], rands[:,[i]] * rands[:,[i+1]]],axis=1)
Q2 = np.dot(np.transpose(Q),Q)
Q3 = np.linalg.inv(Q2) * Q2[1,1]
return Q3
答案 0 :(得分:0)
我能够使用ipyparallel
包简单地使用map_sync
而不是multiprocessing
包将运行时间减少一半来并行化函数。我不确定为什么前一个包的开销比后者少,但对于前者,加载数据确实需要很长时间,而后者则在并行执行期间将rands
识别为变量。但是,在这两种情况下,数据都存储在RAM中。如果有人读到这个并且知道ipyparallel
更快的原因,请做评论。