私はpythonに数値の絶対値を見つけるために似た2つの方法があることに気づきました:
最初
abs(-5)
二番目
import math
math.fabs(-5)
これらの方法はどのように異なりますか?
私はpythonに数値の絶対値を見つけるために似た2つの方法があることに気づきました:
最初
abs(-5)
二番目
import math
math.fabs(-5)
これらの方法はどのように異なりますか?
回答:
math.fabs()可能であれば、引数を浮動小数点に変換します(変換できない場合は、例外をスローします)。次に、絶対値を取り、結果を浮動小数点数として返します。
浮動小数点数に加えて、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
fabs常に変動する性質のため、時間がかかることについてのコメントを追加すると、正しい答えが得られます!
__builtin__.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()です。フロートの場合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()。
from math import fabs確かに使用し、-5.0両方を試してください。
abs整数と浮動小数点数だけでなく、結果の型が引数と常に同じであるとは限りませんabs(3+4j)。