Python – abs vs fabs
我注意到,在python中有两个类似的查找方法来查找数字的绝对值:
第一
abs(-5)
第二
import math math.fabs(-5)
这些方法如何不同?
math.fabs()
将其参数转换为浮点数(如果不能,则抛出exception)。 然后取绝对值,并将结果作为浮点数返回。
除了浮点数外, abs()
还可以处理整数和复数。 它的返回types取决于它的参数的types。
In [7]: type(abs(-2)) Out[7]: int In [8]: type(abs(-2.0)) Out[8]: float In [9]: type(abs(3+4j)) Out[9]: float In [10]: type(math.fabs(-2)) Out[10]: float In [11]: type(math.fabs(-2.0)) Out[11]: float In [12]: type(math.fabs(3+4j)) --------------------------------------------------------------------------- TypeError Traceback (most recent call last) /home/alexei/<ipython-input-12-8368761369da> in <module>() ----> 1 type(math.fabs(3+4j)) TypeError: can't convert complex to float
编辑:@aixbuild议,比较速度差异更好(更公平)的方式:
In [1]: %timeit abs(5) 10000000 loops, best of 3: 86.5 ns per loop In [2]: from math import fabs 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 In [8]: %timeit abs(-5.0) 10000000 loops, best of 3: 91.8 ns per loop In [9]: %timeit fabs(-5.0) 10000000 loops, best of 3: 91 ns per loop
所以看起来abs()
只比整个fabs()
稍微有速度优势。 对于浮点数, abs()
和fabs()
performance出相似的速度。
除了@aix所说的之外,还有一点需要考虑的是速度差异:
In [1]: %timeit abs(-5) 10000000 loops, best of 3: 102 ns per loop In [2]: import math In [3]: %timeit math.fabs(-5) 10000000 loops, best of 3: 194 ns per loop
所以abs()
比math.fabs()
更快。
math.fabs()
总是返回float,而abs()
可能返回整数。