Je me pose cette question depuis un certain temps. Comme le dit le titre, qu'est-ce qui est le plus rapide, la fonction proprement dite ou la simple élévation à la moitié de la puissance ?
UPDATE
Il ne s'agit pas d'une optimisation prématurée. Il s'agit simplement de savoir comment le code sous-jacent fonctionne réellement. Quelle est la théorie sur le fonctionnement du code Python ?
J'ai envoyé un courriel à Guido van Rossum parce que je voulais vraiment connaître les différences entre ces méthodes.
Mon email :
Il existe au moins 3 façons de faire une racine carrée en Python : math.sqrt, l'opérateur '**' et pow(x,.5). l'opérateur '**' et pow(x,.5). Je suis juste curieux de savoir quelles sont les différences dans l'implémentation de chacune d'entre elles. En termes d'efficacité, quelle est la meilleure est la meilleure ?
Sa réponse :
pow et ** sont équivalents ; math.sqrt ne fonctionne pas pour les nombres complexes, et renvoie à la fonction C sqrt(). Quant à savoir laquelle est rapide, je n'en ai aucune idée...
114 votes
C'est génial que le Guido réponde aux emails.
3 votes
Evan, j'ai été surpris d'avoir une réponse
13 votes
Je ne pense pas que ce soit une mauvaise question. Par exemple, x * x est 10 fois plus rapide que x ** 2. La lisibilité est un tossup dans cette situation, alors pourquoi ne pas faire la méthode rapide ?
1 votes
TM, pour x 2 étant plus lent que x*x, je pense que cela pourrait être dû à un appel de fonction complet pour x 2...
12 votes
Casey, je suis d'accord avec vous sur l'aspect "optimisation prématurée" :) Votre question ne ressemble pas à une optimisation prématurée pour moi : il n'y a aucun risque que l'une des variantes casse votre code. Il s'agit plutôt de mieux savoir ce que vous faites (en termes de temps d'exécution) lorsque vous choisissez pow() plutôt que math.sqrt().
1 votes
Pourquoi ne pas remplacer math.sqrt par un
sqrt = lambda n: n**0.5
alors que c'est plus rapide et que cela fonctionne aussi pour les nombres complexes comme l'a dit Guido.9 votes
Il ne s'agit pas d'une optimisation prématurée, mais plutôt d'éviter une pessimisation prématurée (réf. n° 28, normes de codage C++, A.Alexandrescu). Si
math.sqrt
est une routine plus optimisée (comme c'est le cas) et exprime l'intention plus clairement, elle devrait toujours être préférée àx**.5
. Ce n'est pas de l'optimisation prématurée que de savoir ce que vous écrivez, et de choisir l'alternative qui est plus rapide et fournit plus de clarté au code. Dans ce cas, vous devez argumenter tout aussi bien pourquoi vous avez choisi les autres alternatives.