我对 abs() 和 fabs() 函数进行了一些简单的测试,但我不明白使用 fabs() 有什么好处,如果是的话:
1) 慢
2) 仅适用于 float
3) 如果用于不同的类型会抛出异常
In [1]: %timeit abs(5)
10000000 loops, best of 3: 86.5 ns per loop
In [3]: %timeit fabs(5)
10000000 loops, best of 3: 115 ns per loop
In [4]: %timeit abs(-5)
10000000 loops, best of 3: 88.3 ns per loop
In [5]: %timeit fabs(-5)
10000000 loops, best of 3: 114 ns per loop
In [6]: %timeit abs(5.0)
10000000 loops, best of 3: 92.5 ns per loop
In [7]: %timeit fabs(5.0)
10000000 loops, best of 3: 93.2 ns per loop
float 更慢!
从我的立场来看,使用 fabs() 的唯一优势是使您的代码更具可读性,因为通过使用它,您清楚地表明了您使用浮点/双点值的意图
fabs()还有其他用途吗?
最佳答案
来自 an email response来自 Tim Peters :
Why does math have an fabs function? Both it and the abs builtin function wind up calling fabs() for floats. abs() is faster to boot.
没什么深奥的——数学模块提供了 C89 标准中的所有内容 libm(+ 一些扩展),fabs() 是一个标准 C89 libm 函数。
没有一个明确的(对我而言)为什么一个会比 其他;听起来很意外; math.fabs() 当然可以做得更快 (如目前实现的(通过 math_1),它忍受了一堆 通用“尝试猜测 libm 是否应该设置 errno” 浪费的样板文件(没有域或范围错误 fabs())) 是可能的。
似乎没有使用 fabs
的有利理由。只需将 abs
用于几乎所有目的。
关于python - abs() vs fabs() 速度差异和 fabs() 的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21994052/