问题:Python-ABS与工厂
我注意到在python中,有两种相似的寻找数字绝对值的方法:
第一
abs(-5)
第二
import math
math.fabs(-5)
这些方法有何不同?
回答 0
math.fabs()
如果可以,将其参数转换为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
回答 1
编辑:正如@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()
。
回答 2
math.fabs()
总是返回浮点数,而abs()
可能返回整数。
回答 3
abs()
:根据参数返回绝对值,即,如果参数为int则返回int,如果参数为float则返回float。它也适用于复杂变量,即abs(a+bj)
也可以工作并返回绝对值,即math.sqrt(((a)**2)+((b)**2)
math.fabs()
:仅适用于整数或浮点值。无论参数类型是什么,总是返回绝对浮点值(复数除外)。