Python - abs vs fabs

Я заметил, что в python есть два похожих метода для поиска абсолютного значения числа:

Первая

abs(-5)

Второе

import math
math.fabs(-5)

Как эти методы отличаются?

Ответ 1

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

Ответ 2

Изменить: как предложил @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().

Ответ 3

math.fabs() всегда возвращает float, а abs() может возвращать целое число.

Ответ 4

abs(): возвращает абсолютное значение в соответствии с аргументом, т.е. если аргумент является int, то он возвращает int, если аргумент является float, он возвращает float. Также он работает с комплексной переменной, то есть abs(a+bj) также работает и возвращает абсолютное значение, т.е. math.sqrt(((a)**2)+((b)**2)

math.fabs(): работает только с целочисленными значениями или значениями с плавающей запятой. Всегда возвращает абсолютное значение с плавающей запятой независимо от типа аргумента (кроме комплексных чисел).