Python には、数値の絶対値を見つけるための 2 つの類似した方法があることに気付きました。
初め
abs(-5)
2番
import math
math.fabs(-5)
これらの方法はどのように異なりますか?
Python には、数値の絶対値を見つけるための 2 つの類似した方法があることに気付きました。
初め
abs(-5)
2番
import math
math.fabs(-5)
これらの方法はどのように異なりますか?
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
編集:@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()
。
math.fabs()
常に float を返しますが、abs()
integer を返す場合もあります。