52 votes

Pourquoi math.sqrt est-il massivement plus lent que l'exponentiation ?

Je n'arrive pas à croire ce que je viens de mesurer :

python3 -m timeit -s "from math import sqrt" "sqrt(2)"
5000000 loops, best of 5: 42.8 nsec per loop

python3 -m timeit "2 ** 0.5"
50000000 loops, best of 5: 4.93 nsec per loop

Cela va à l'encontre de toute intuition... ce devrait être exactement le contraire !

Python 3.8.3 sur macOS Catalina

4 votes

Le premier code a la surcharge de faire un import et la seconde ne l'est pas.

11 votes

@JohnGordon L'importation se trouve dans la déclaration d'installation, qui ne doit pas être chronométrée.

25voto

mkrieger1 Points 4461

Pour améliorer Réponse de Chepner voici une preuve :

Python 3.5.3 (default, Sep 27 2018, 17:25:39) 
[GCC 6.3.0 20170516] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import dis
>>> dis.dis('2 ** 0.5')
  1           0 LOAD_CONST               2 (1.4142135623730951)
              3 RETURN_VALUE

vs.

>>> dis.dis('sqrt(2)')
  1           0 LOAD_NAME                0 (sqrt)
              3 LOAD_CONST               0 (2)
              6 CALL_FUNCTION            1 (1 positional, 0 keyword pair)
              9 RETURN_VALUE

2voto

akostrikov Points 57
>>> dis.dis('44442.3123 ** 0.5')
          0 LOAD_CONST               0 (210.81345379268373)
          2 RETURN_VALUE

Je ne crois pas, que 44442.3123 ** 0.5 est précalculé au moment de la compilation. Nous devrions mieux vérifier l'AST du code.

>>> import ast
>>> import math
>>> code = ast.parse("2**2")
>>> ast.dump(code)
'Module(body=[Expr(value=BinOp(left=Num(n=2), op=Pow(), right=Num(n=2)))])'
>>> code = ast.parse("math.sqrt(3)")
>>> ast.dump(code)
"Module(body=[Expr(value=Call(func=Attribute(value=Name(id='math', ctx=Load()), attr='sqrt', ctx=Load()), args=[Num(n=3)], keywords=[]))])"

0 votes

ast.parse n'effectue tout simplement pas l'optimisation du judas. (Je crois que l'optimiseur utilise le code d'octet généré à partir de l'arbre d'analyse comme entrée).

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