Python使用多线程加载多个文件能否提速?为何实测反而更慢
多线程速度反而更慢的核心原因如下:
- 计时指标选择错误
你使用的time.process_time()统计的是进程所有线程的CPU执行时间总和,并不是真实世界的流逝时间(墙上时间)。多线程场景下每个线程的CPU耗时都会被累加统计,结果自然会高于单线程的数值。如果要对比真实的任务执行耗时,应该换用time.perf_counter()或者time.time()作为计时指标。 - 任务实际没有产生磁盘I/O阻塞,性质发生变化
测试时你刚写完10000个文件就立刻执行读取逻辑,这些文件的内容全部缓存在操作系统的页缓存(Page Cache)中,根本没有触发真实的磁盘I/O等待。原本预期的I/O密集型任务实际变成了CPU密集型任务,此时Python GIL争抢、线程上下文切换的开销完全盖过了多线程的收益,效率反而低于单线程顺序执行。 - 多线程额外开销大于收益
即便是真实I/O场景,这种小文件分批处理的模式也会产生线程池调度、任务拆分、结果合并的额外开销,如果I/O等待的时间节省量低于这些额外开销,也会出现多线程反而更慢的情况。如果你使用的是机械硬盘,多线程随机读还会导致磁头频繁寻址,效率比单线程顺序读更低。
验证方法:清空系统页缓存后换用正确的计时指标重新测试,就能观察到多线程对真实I/O场景的提速效果。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

