113 votes

Python - abs vs fab

J'ai remarqué qu'en python il y a deux semblable à la recherche de méthodes pour trouver la valeur absolue d'un nombre:

Première

abs(-5)

Deuxième

import math
math.fabs(-5)

Comment ces méthodes diffèrent-ils?

134voto

NPE Points 169956

math.fabs() convertit son argument à flotteur si il peut (s'il le peut, il déclenche une exception). Il prend alors la valeur absolue, et renvoie le résultat sous la forme d'un flotteur.

En plus de flotteurs, abs() travaille également avec des nombres entiers et des nombres complexes. Son type de retour dépend du type de son argument.

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

9voto

Kay Zhu Points 9703

Edit: @aix suggéré, une meilleure (plus juste) pour comparer la différence de vitesse:

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

Il semble donc abs() seulement a un léger avantage en termes de vitesse de plus de fabs() pour les entiers. Pour les chars, abs() et fabs() de démontrer vitesse similaire.


En plus de ce que @aix a dit, une chose de plus à prendre en compte est la différence de vitesse:

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

Donc, abs() plus rapide que de l' math.fabs().

3voto

Tadeck Points 37046

math.fabs() retourne toujours flotter tout en abs() peut revenir entier.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X