Variable Lookup: Warum ist ** mit Variablen so viel langsamer als mit Werten

Ich habe über math.sqrt gelesen, der schneller ist als ** und heute habe ich versucht. Aber das interessante Ding war nicht der Zeitunterschied zwischen diesen beiden, sondern der Zeitunterschied zwischen ** mit Variablen und ** mit Werten:

 value1 = 10.1 value2 = 0.5 %timeit value1 ** value2 # 1000000 loops, best of 3: 645 ns per loop %timeit 10.1 ** 0.5 # 10000000 loops, best of 3: 60.7 ns per loop 

Das ist mehr als zehnmal schneller Während für die Mathematik-Funktion sind die Timings fast identisch (nur wenige ns mehr für die variable Lookup):

 import math %timeit math.sqrt(10.1) # 1000000 loops, best of 3: 529 ns per loop %timeit math.sqrt(value1) # 1000000 loops, best of 3: 568 ns per loop 

Könnte jemand erklären, warum die variable Lookup macht einen so großen Unterschied für ** während es wenig Unterschied macht für math.sqrt ?

Rahmen:

  • Python 3.5
  • Windows 10 64 bit

  • Numpy Arrays: Füllen und Extrahieren von Daten schnell
  • Slicing eine Python-Liste mit einem NumPy-Array von Indizes - irgendeine schnelle Weise?
  • C ++ 11 regex langsamer als python
  • Schreiben Sie doppelte (dreifache) Summe als inneres Produkt?
  • Ist es eine schlechte Praxis, Pythons getattr ausgiebig zu benutzen?
  • Die effizienteste Möglichkeit, NaN-Werte in numpy Array zu füllen
  • One Solution collect form web for “Variable Lookup: Warum ist ** mit Variablen so viel langsamer als mit Werten”

    Verwenden von Variablen:

     In [41]: def var(): ....: value1 ** value2 ....: In [43]: dis.dis(var) 2 0 LOAD_GLOBAL 0 (value1) 3 LOAD_GLOBAL 1 (value2) 6 BINARY_POWER 7 POP_TOP 8 LOAD_CONST 0 (None) 11 RETURN_VALUE 

    Mit sofortigen Werten:

     In [44]: def imm(): ....: 10.1 ** 0.5 ....: In [45]: dis.dis(imm) 2 0 LOAD_CONST 3 (3.1780497164141406) 3 POP_TOP 4 LOAD_CONST 0 (None) 7 RETURN_VALUE 

    Stellt sich heraus, dass der Compiler uns überspielt und die Leistung vorher berechnet hat.

    Python ist die beste Programmiersprache der Welt.