多进程下相同任务的CPU核心执行耗时差异原因咨询
多进程相同计算任务耗时差异显著的原因分析
问题背景
我在一台拥有12个CPU核心的Ubuntu机器上运行Python 3.7.5代码,预留2个核心用于系统开销,使用10个核心同时执行完全相同的阶乘计算任务。结果显示所有核心几乎同时启动,但相同计算的完成耗时差异显著,预期是多进程下相同计算任务的耗时相近,请问导致该现象的原因是什么?
测试代码
from multiprocessing import Pool, cpu_count from datetime import datetime def stress_test(args): cpu, value = args start_time = datetime.now() print(f'cpu starts: {cpu}') for i in range(value): value = value * i print(f"cpu: {cpu} time: {datetime.now() - start_time}") if __name__ == '__main__': start_time = datetime.now() cpu_count = cpu_count() - 2 with Pool(cpu_count) as mp_pool: mp_pool.map(stress_test, [(cpu, int(2e8)) for cpu in range(cpu_count)]) print(f"total: {datetime.now() - start_time}")
原因分析
- CPU硬件层面的差异:现代CPU核心并非完全同质化。部分CPU采用大小核架构,即使是同类型核心,制造工艺的微小偏差也会带来基础性能差异;此外,核心的散热条件、供电优先级不同,会导致实际运行频率波动,直接影响计算速度。
- 系统调度的干扰:即便预留了2个核心,系统后台仍有各类服务、守护进程在运行,这些进程可能临时抢占计算核心的时间片。不同计算进程遇到的调度干扰频率和时长不同,计算被打断的次数存在差异,最终体现为耗时差距。
- 内存访问的竞争与缓存差异:阶乘计算会生成超大整数,这类数据的存储、读写会占用大量内存带宽。多进程同时访问内存时会产生竞争,不同进程的内存访问延迟不一致;同时,各进程的缓存命中情况有差异,缓存命中率高的进程计算速度会更快。
- 进程资源分配的微小延迟:虽然日志显示所有进程几乎同时启动,但实际的CPU绑定、内存页分配等操作存在微小时间差。随着计算任务推进,这些初始延迟会被累积放大,最终导致耗时差异显著。
- Python大整数运算的隐式差异:当计算数值超过普通整数范围后,Python会自动切换到大整数实现。不同进程的大整数在内存中的布局、分配的内存块位置不同,会导致运算效率出现差异。
内容的提问来源于stack exchange,提问作者J.L
相关产品推荐
相关产品推荐

