我的目标是评估f1(f2(n2),n1)的表达式,n2具有近70个值,n1具有近20个值,因此共有1400个表达式。我想使用dask通过代码优化此问题计算的结构([n1列表中n1的n2列表中n2的延迟(f1)(延迟(f2)(n2),n1]),调度程序=“进程”,num_workers = num_workers)。关于多处理,我认为dask具有重用f2(n2)值的巨大优势。使用dask生成的图形,应评估f2 70次和f1 1400次。但是,如果使用多重处理,我们将评估1400 f1和1400 f2。生成的dask图证实了这一想法。
如果我设置num_workder = 5,那么dask需要11分钟才能完成,而multiprocessing需要30分钟才能完成,这就是我所期望的。但是,当我设置num_workers = 20时,多处理需要9分钟才能完成,而dask需要8分钟,dask的优势就消失了!对于多处理,时间和核心数之间几乎是线性的关系,但是并不是那么容易。我注意到(使用top命令),对于多处理,每个内核的CPU使用率几乎为100%,num_workers = 5/20。但是,使用dask时,当num_worker = 20时,最多时间,几乎一半的内核处于睡眠状态,而CPU的使用率为0%,另一半内核也处于低杯使用状态。
我使用daks提供的工具对程序进行了概要分析,结果显示没有明显的CPU浪费,如下所示: profiled result
此外,另一个信息是f1和f2的返回是熊猫数据帧,其形状为(1000,3000),float数据类型。我不知道进程之间的通信是否很重要。
我想充分利用20个内核,谢谢大家的帮助和帮助。