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

  • Gibt es einen Weg zu umgehen Python list.append () immer schlanker in einer Schleife, wie die Liste wächst?
  • Schnellste Weg, um den Schwerpunkt eines Satzes von Koordinaten-Tupeln in Python ohne numpy zu berechnen
  • Effizientes Python-Array mit 100 Millionen Nullen?
  • Python-Stringsuche Effizienz
  • Mögliche Optimierungen für die Berechnung der quadratischen euklidischen Distanz
  • Split eine Liste der Daten durch eine andere Liste der Daten
  • 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.