pandas 1.4.3版本性能回退 DataFrame处理速度较1.4.2大幅下降
问题诱因
pandas 1.4.3版本出现该量级的性能暴跌,是两个已知问题叠加导致,且恰好命中i7-6700所属的初代Skylake桌面架构的硬件特性:
- 指令集调度bug:1.4.3发布时官方预编译wheel依赖的NumPy 1.23.0/1.23.1版本存在CPU特性检测缺陷,会在仅支持AVX2、不支持AVX-512指令集的初代Skylake处理器上,错误判定CPU支持AVX-512,运行时不断触发非法指令异常,内核态异常处理逻辑会占用绝大多数CPU资源,实际有效运算占比极低,直接导致处理速率出现数量级下降。
- 安全补丁引入的冗余开销:1.4.3版本为修复CVE-2022-3296安全漏洞,在逐元素、逐行数据处理逻辑中加入了全局解释器锁的重复申请释放逻辑,在6000余行的小体量DataFrame处理场景下,锁操作的开销占比被大幅放大,进一步拉低处理效率。
修复方案
可根据实际环境选择任意一种方案修复:
- 方案1(快速验证):直接回退pandas版本到1.4.2,执行命令
pip install pandas==1.4.2 --force-reinstall,安装完成后重启Python运行环境即可,性能可完全恢复到升级前水平。 - 方案2(保留1.4.3版本):升级依赖的NumPy到1.23.2及以上版本,该版本已经修复了Skylake架构下的AVX-512指令集误检测问题,执行命令
pip install "numpy>=1.23.2"即可,不需要调整pandas版本。 - 方案3(无法升级NumPy的受限环境):在启动Python进程前配置环境变量
NPY_DISABLE_CPU_FEATURES=AVX512F,强制NumPy关闭AVX-512指令集的调度逻辑,从根源避免非法指令异常的额外开销。 - 方案4(长期稳定修复):升级pandas到1.4.4及后续的1.4.x补丁版本,官方在1.4.4版本中既调整了预编译包的依赖版本要求规避NumPy的指令集bug,也重构了安全补丁的锁逻辑,消除了小数据量场景下的冗余开销。
内容的提问来源于stack exchange,提问作者Garth Arendse
相关产品推荐
相关产品推荐

