【发布时间】: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