114

我注意到在 python 中有两种类似的查找数字绝对值的方法:

第一的

abs(-5)

第二

import math
math.fabs(-5)

这些方法有何不同?

4

4 回答 4

134

math.fabs()如果可以,则将其参数转换为浮点数(如果不能,则抛出异常)。然后它取绝对值,并将结果作为浮点数返回。

除了浮点数,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
于 2012-05-27T07:21:00.373 回答
9

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

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().

于 2012-05-27T07:22:47.263 回答
3

math.fabs()总是返回浮点数,而abs()可能返回整数。

于 2012-05-27T07:22:24.930 回答
1

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

math.fabs():它仅适用于整数或浮点值。无论参数类型是什么(复数除外),始终返回绝对浮点值。

于 2018-02-05T13:46:21.100 回答