You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么pandas调用read_pickle时ThreadPool比进程池性能更差?

核心原因分析

1. 任务类型误判

你默认该操作是IO密集型,但实际是CPU密集型占主导:
每个pickle文件对应100万行43列的大尺寸DataFrame,从磁盘读取二进制内容的IO耗时占比极低,绝大多数时间都消耗在把二进制内容反序列化为内存中结构化的DataFrame对象这一步,属于纯CPU计算任务。

2. CPython全局解释器锁(GIL)的限制

CPython解释器的GIL机制决定了同一进程内的所有线程,同一时间只能有一个线程持有GIL执行Python字节码:

  • 线程池的所有线程共享主进程的同一个GIL,反序列化pickle的逻辑执行过程中会长期持有GIL,仅在极短的磁盘IO等待阶段才会释放GIL切换线程。最终10个线程的反序列化任务本质是串行执行,还额外叠加了线程切换的开销,所以总耗时远高于预期。
  • 进程池的每个子进程都拥有独立的Python解释器和独立的GIL,10个进程可以在12核CPU上实现真正的并行计算,反序列化任务可以同时跑,因此耗时大幅降低。

你观察到的进程池主进程CPU耗时极低(总耗时仅683ms),是因为%%time统计的是Jupyter主进程的CPU消耗,子进程的CPU耗时没有被统计到主进程的结果中;如果把所有子进程的CPU耗时加总,和线程池统计到的9min27s总CPU耗时是接近的,差异仅来自进程启动、进程间通信的额外开销。

内容的提问来源于stack exchange,提问作者kdr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 20:18:03