【问题标题】:abs() vs fabs() speed difference and advantage of fabs()abs() vs fabs() 速度差异和 fabs() 的优势
【发布时间】:2014-03-26 11:41:13
【问题描述】:

我对 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

浮动更慢!

从我的立场来看,使用 fabs() 的唯一优势是使您的代码更具可读性,因为通过使用它,您清楚地表明了您使用浮点/双点值的意图

fabs()还有其他用途吗?

【问题讨论】:

  • 过早的优化,嗯?
  • 运行时的最大差异约为 29 ns。您必须调用该函数超过 200 亿次才能重新花 10 分钟思考它。
  • @devnull 当你发现两个看起来做同样事情的函数时,很自然地会弄清楚它们的区别是什么。这些差异之一是时机。我确定这个问题与过早优化无关。
  • 如果您将int 传递给fabs,它显然会慢一些,因为它必须将其转换为float。换句话说,您展示的唯一公平比较是在-5.0 上存在0.7 ns 差异,这意味着什么都没有。差异很大可能只是由于某些随机因素造成的,并且在尝试多次时不一致。
  • @DSM 在图像处理中很常见,例如进行数百万次操作并期望几乎立即获得结果。不要认为任何优化都为时过早。

标签: python function absolute-value


【解决方案1】:

来自an email response来自Tim Peters

为什么数学有一个 fabs 函数?它和 abs 内置函数 结束调用 fabs() 的浮动。 abs() 启动速度更快。

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

没有一个明确的(对我而言)为什么一个会比 其他;听起来很意外; math.fabs() 当然可以做得更快 (如目前实施的(通过 math_1),它忍受了一堆 通用“尝试猜测 libm 是否应该设置 errno” 浪费的样板文件(没有域或范围错误 fabs())) 是可能的。

似乎没有使用fabs 的有利理由。只需将abs 用于几乎所有目的。

【讨论】:

  • 不是特定于 Python 的答案,但如果您必须将 float 转换为 int 或反之亦然,那将是相当昂贵的。在这种情况下,根据语言支持的复杂程度,它可能只在编译期间执行一次(影响可以忽略不计)。或者,支持人员甚至可能为您选择“正确”的库代码。然后,我希望 fabs() 更快,因为它所要做的就是无条件地清除高位(假设 IEEE 754 浮动),而 abs() 需要检查负数然后否定它。同样,使用常量参数,它可能可以忽略不计(只做一次)。
  • 如果我理解正确的话,fabs 被包括在内,因为它是 C89 库中的标准函数。我完全可以理解为什么功能、模块被标准化的优势,但是只有 fabs() 函数来完成当前分配给 abs 和 fabs 的工作不是更有意义吗?
  • @metacore 否。only abs 适用于 any 数字对象是有意义的。例如abs(Decimal('-5.0')) 返回Decimal(5.0),而fabs(Decimal('-5.0')) 返回5.0 [注意强制转换为float,这会导致精度损失,在一般情况下]。
  • @PhilPerry -- 在 python 中,转换将重复进行。 几乎所有的事情都是在运行时在python中完成的——很少有“编译时”(解析时)优化。
猜你喜欢
  • 2012-06-02
  • 1970-01-01
  • 2020-09-21
  • 1970-01-01
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多