Python - abs vs fabs

I noticed that in python there are two similar looking methods for finding the absolute value of a number:

First

abs(-5)

Second

import math
math.fabs(-5)

How do these methods differ?

137525 次浏览

math.fabs() converts its argument to float if it can (if it can't, it throws an exception). It then takes the absolute value, and returns the result as a float.

除了浮点数,abs()还处理整数和复数。其返回类型取决于其参数的类型。

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/npe/<ipython-input-12-8368761369da> in <module>()
----> 1 type(math.fabs(3+4j))


TypeError: can't convert complex to float

math.fabs()始终返回 float,而 abs()可能返回整数。

编辑: 正如@aix 所建议的,比较速度差异的一种更好(更公平)的方法是:

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()表现出相似的速度。


除了@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()快。

abs() : 根据参数返回绝对值,也就是说,如果参数是 int,那么它返回 int; 如果参数是 float,那么它返回 float。 它也适用于复杂变量,也就是说,abs(a+bj)也适用并返回绝对值,即 math.sqrt(((a)**2)+((b)**2)

返回文章页面 它只对整数或浮点值起作用。无论参数类型是什么(复数除外) ,始终返回绝对浮点值。

abs()fabs()的区别是:

Abs () : 按元素方式计算绝对值。但是元素是类型化的(int) ,那么它将返回类型化的(int) ,如果参数是类型化的 float,那么它将返回类型化的(float)。无论传递什么样的简单信息,都会返回相同类型的数据。

Abs ()方法还可以处理复杂的数据

例如:

x = np.array([-12,-19,4])
abs_x = np.abs(x)
print(abs_x)    #output: [12 19 4]

Fabs () : 以元素的方式计算绝对值。但是这个方法返回的值总是浮点数。

所以 abs()fabs()的主要区别是:

fabs()总是返回 float,而 fabs()不能处理复杂的值。

例如:

x = np.array([-12,-19,4])
abs_x = np.fabs(x)
print(abs_x)  #output: [12.0 19.0  4.0]