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