J'ai remarqué qu'en python, il existe deux méthodes similaires pour trouver la valeur absolue d'un nombre:
Première
abs(-5)
Seconde
import math
math.fabs(-5)
En quoi ces méthodes diffèrent-elles?
math.fabs()
convertit son argument en float s'il le peut (s'il ne le peut pas, il lève une exception). Il prend ensuite la valeur absolue et renvoie le résultat sous forme de flottant.
En plus des flottants, abs()
fonctionne également avec des 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/npe/<ipython-input-12-8368761369da> in <module>()
----> 1 type(math.fabs(3+4j))
TypeError: can't convert complex to float
abs
fonctionne avec bien plus que des entiers et des flottants, et le type de résultat n'est pas toujours le même que l'argument, par exempleabs(3+4j)
.fabs
prendre plus de temps en raison de sa nature toujours flottante et vous avez la bonne réponse!__builtin__.abs()
être appliquées avec succès?__abs__
méthode magiqueEdit: comme @aix l'a suggéré, une meilleure façon (plus juste) de comparer la différence de vitesse:
Il semble donc qu'il
abs()
n'y ait qu'un léger avantage de vitesse par rapportfabs()
aux nombres entiers. Pour les flotteursabs()
etfabs()
démontrer une vitesse similaire.En plus de ce que @aix a dit, une autre chose à considérer est la différence de vitesse:
C'est donc
abs()
plus rapide quemath.fabs()
.la source
from math import fabs
bien sûr et essayez les-5.0
deux.math.fabs()
renvoie toujours float, tandis queabs()
peut renvoyer un entier.la source
abs
peut renvoyer n'importe quel type, selon la__abs__
méthode spéciale du type sur lequel il est appelé.abs()
: Renvoie la valeur absolue selon l'argument, c'est-à-dire que si l'argument est int alors il retourne int, si l'argument est float, il renvoie float. Il fonctionne également sur des variables complexes, c'est-à-direabs(a+bj)
fonctionne également et renvoie une valeur absolue, c'est-à-diremath.sqrt(((a)**2)+((b)**2)
math.fabs()
: Cela ne fonctionne que sur les valeurs entières ou flottantes. Renvoie toujours la valeur flottante absolue quel que soit le type d'argument (sauf pour les nombres complexes).la source