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()可能返回整数。