abs()vs fabs()速度差异和fabs的优势()

met*_*ddy 20 python function absolute-value

我在abs()和fabs()函数上运行了一些简单的测试,我不明白使用fabs()的优点是什么,如果是:

1)慢一点

2)仅适用于花车

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
Run Code Online (Sandbox Code Playgroud)

花车上的速度更慢!

从我所处的位置使用fabs()的唯一优势是使代码更具可读性,因为通过使用它,您明确表明了使用float/double point值的意图

有没有其他用途的fabs()?

Inb*_*ose 20

从电子邮件回复来自蒂姆·彼得斯:

为什么数学有fabs功能?它和abs builtin函数最终都会调用fabs()进行浮点运算.abs()启动速度更快.

没有什么 - 数学模块提供C89标准libm中的所有内容(+一些扩展),fabs()是一个标准的C89 libm函数.

没有一个明确的(对我来说)为什么一个人比另一个人更快的原因; 听起来很意外; math.fabs()当然可以更快(如当前实现的(通过math_1),它承受了一堆通用的"试图猜测libm是否应该设置errno"浪费的样板(没有可能的域或范围错误)对于fabs())).

似乎没有理由使用fabs.只是abs用于几乎所有目的.

  • @metacore不会.****abs`适用于任何*数字对象是有意义的.例如`abs(十进制(' - 5.0'))`返回`十进制(5.0)`,而`fabs(十进制(' - 5.0'))`返回`5.0` [注意强制转换为`float`结果在一般情况下,精度损失]. (4认同)