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

为何NumPy的fabs函数比abs函数慢两倍以上?

NumPy中np.fabs()与np.abs()的性能差异分析

测试环境

  • Python版本:3.12.7
  • NumPy版本:2.2.4
  • 处理器:AMD Ryzen 7 3800X

测试脚本

import numpy as np, timeit as ti

a = np.random.rand(1000).astype(np.float32)
print(f'Minimum, median and maximum execution time in us:')

for fun in ('np.fabs(a)', 'np.abs(a)'):  
  t = 10**6 * np.array(ti.repeat(stmt=fun, setup=fun, globals=globals(), number=1, repeat=999))
  print(f'{fun:20}  {np.amin(t):8,.3f}  {np.median(t):8,.3f}  {np.amax(t):8,.3f}') 

运行结果

Minimum, median and maximum execution time in us:
np.fabs(a)               1.813     1.843     4.929
np.abs(a)                0.781     0.811     1.463

问题

结果显示,尽管np.abs()功能更为丰富,但np.fabs()的运行速度却比其慢两倍以上,请问造成该性能差异的原因是什么?

性能差异原因

  • 类型处理逻辑冗余:np.fabs()仅支持浮点型输入,但实现中保留了额外的类型校验分支,确保输入符合要求;而np.abs()虽然兼容多类型,针对浮点型输入时会直接跳过冗余校验,调用更高效的计算路径。
  • SIMD指令利用差异:np.abs()处理float32数组时,会直接调用CPU的SIMD向量指令(如AVX2),批量并行处理多个元素;np.fabs()的底层实现未充分适配现代CPU的向量加速能力,单元素处理的开销被放大。
  • 函数分发路径不同:np.fabs()的函数调度逻辑更复杂,需要经过多层分发才能到达计算内核;np.abs()的分发路径更简洁,能快速定位到针对浮点型的优化内核,减少了调用环节的开销。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 21:17:47