Python-ABS与工厂


107

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

第一

abs(-5)

第二

import math
math.fabs(-5)

这些方法有何不同?

Answers:


127

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

4
abs不仅可以使用整数和浮点数,而且结果类型并不总是与参数相同,例如abs(3+4j)
2012年

1
添加评论fabs,因为它总是浮动的,所以需要更长的时间,您将获得正确的答案!
帕特里克·佩里尼

@agf:感谢您提醒我有关复数的信息。出于兴趣,还有哪些其他类别的事物可以__builtin__.abs()成功应用?
NPE 2012年

5
@aix定义__abs__魔术方法的任何用户定义的类
agf 2012年

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


3
您没有在这里比较苹果。一定要使用from math import fabs,然后-5.0两者都尝试。
2012年

计时结果也不可靠吗?您最初在102ns时具有abs(-5),然后将其显示为88.3ns。即使从内部尝试避免出现问题,也绝不能从任何基准测试中得出结论。
彼得·汉森

1
还有两点:由于abs在内置文件中查找,而fab在模块名称空间中,因此这仍然可以比较苹果和橙子。先执行“ xabs = abs”,然后执行xabs(num)删除该效果。而且,在Python 3.2中,变化很大,显然abs()更快(> 2x),至少在浮点数上。
彼得·汉森

1
@PeterHansen是的,它们是来自两次在不同系统负载下的运行。尽管在同一组测试中进行比较时,相对差异仍然有效。另外,感谢您指出名称空间的差异-我没有考虑这一点。我还没有在3.2上尝试过,但是很高兴知道!稍后,我将用您的建议更新答案:)再次感谢!
KZ

3

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


6
abs可以返回任何类型,具体取决于__abs__调用该类型的特殊方法。
2012年

0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.