为什么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
相关产品推荐
相关产品推荐

