Я заметил, что в python есть два похожих метода для поиска абсолютного значения числа:
Первая
abs(-5)
Второе
import math
math.fabs(-5)
Как эти методы отличаются?
Я заметил, что в python есть два похожих метода для поиска абсолютного значения числа:
Первая
abs(-5)
Второе
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/alexei/<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, еще одна вещь, которую следует учитывать, - это разность скоростей:
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()
может возвращать целое число.
abs()
: возвращает абсолютное значение в соответствии с аргументом, т.е. если аргумент является int, то он возвращает int, если аргумент является float, он возвращает float. Также он работает с комплексной переменной, то есть abs(a+bj)
также работает и возвращает абсолютное значение, т.е. math.sqrt(((a)**2)+((b)**2)
math.fabs()
: работает только с целочисленными значениями или значениями с плавающей запятой. Всегда возвращает абсолютное значение с плавающей запятой независимо от типа аргумента (кроме комплексных чисел).