114

Python には、数値の絶対値を見つけるための 2 つの類似した方法があることに気付きました。

初め

abs(-5)

2番

import math
math.fabs(-5)

これらの方法はどのように異なりますか?

4

4 に答える 4

134

math.fabs()可能な場合は引数を float に変換します (できない場合は例外をスローします)。次に、絶対値を取り、結果を 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
于 2012-05-27T07:21:00.373 に答える
9

編集:@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 の発言に加えて、考慮すべきもう 1 つの点は、速度の違いです。

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()常に float を返しますが、abs()integer を返す場合もあります。

于 2012-05-27T07:22:24.930 に答える