【发布时间】:2012-06-02 02:12:28
【问题描述】:
我注意到在 python 中有两种相似的查找数字绝对值的方法:
第一
abs(-5)
第二
import math
math.fabs(-5)
这些方法有何不同?
【问题讨论】:
标签: python
我注意到在 python 中有两种相似的查找数字绝对值的方法:
第一
abs(-5)
第二
import math
math.fabs(-5)
这些方法有何不同?
【问题讨论】:
标签: python
math.fabs()如果可以(如果不能,它会抛出异常),将其参数转换为float。然后它采用绝对值,并将结果返回为float。
除了floats,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
【讨论】:
abs 不仅适用于整数和浮点数,而且结果类型 not 始终与参数相同,例如abs(3+4j)。 span>
fabs 由于其始终浮动的特性而需要更长时间的评论,您就得到了正确的答案!
__builtin__.abs() 还可以成功应用于哪些其他类别的事物?
__abs__魔术方法的用户定义类
math.fabs() 总是返回浮点数,而abs() 可能返回整数。
【讨论】:
abs 可能返回任何类型,具体取决于调用它的类型的 __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() Integers的略微速度优势。 for floats,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
so abs() @速度比math.fabs()。
【讨论】:
from math import fabs肯定,并尝试-5.0两者。 span>
abs():
根据参数返回绝对值,即如果参数为 int,则返回 int,如果参数为 float,则返回 float。
它也适用于复杂变量,即abs(a+bj)也适用并返回绝对值,即math.sqrt(((a)**2)+((b)**2)
math.fabs() :
它仅适用于整数或浮点值。无论参数类型是什么(复数除外),始终返回绝对浮点值。
【讨论】: