Python使用multiprocessing做并行处理几乎未降低耗时如何优化
第一次并行方案提速不明显的原因
- 任务粒度过大,核心利用率低:你将两个DataFrame的处理各打包为一个单独任务分配给两个进程,子进程内部调用
ser.apply仍是单线程逐行执行,仅用到2个CPU核心,剩余硬件资源完全闲置,且两个进程同时运行时会争抢CPU缓存、内存带宽,反而会拖慢单任务执行速度。 - 跨进程通信开销过高:
multiprocessing.Manager的共享字典依赖独立的管理进程做数据中转,你需要将完整的处理后Series从子进程传回主进程,大体积Pandas对象的序列化、反序列化和跨进程传输开销,吃掉了大部分并行节省的时间。 - 重复初始化开销:两个子进程会各自加载一次
pos_tag依赖的词性标注模型,额外增加了无效耗时。
最终Pool方案达到15秒耗时的原理
你的最终实现将单个DataFrame的所有文本行拆分为独立小任务,分发到所有可用CPU核心并行处理,原本单线程跑15秒才能完成的单个DataFrame处理任务,分散到多核心同时执行后耗时大幅降低;即使两个DataFrame的处理串行执行,总耗时也能达到15秒的预期值。该方案规避了前一版本的所有缺陷:
- 充分利用了全部CPU核心,单任务处理效率拉满
- 无需使用Manager传递大对象,
Pool.map内置的IPC机制开销远低于共享字典 - 进程池初始化时就会完成所有子进程的模型加载,无需重复加载资源
pos_tag本身是纯CPU密集型计算任务,没有全局锁限制,完全可以通过多进程实现近似线性的提速,你的最终实现已经达到了最优优化效果。
内容的提问来源于stack exchange,提问作者Alaa M.
相关产品推荐
相关产品推荐

