Neulich habe ich ein Python-Benchmarking gemacht und bin auf etwas Interessantes gestoßen. Unten sind zwei Schleifen, die mehr oder weniger die gleiche Sache machen. Schleife 1 dauert etwa doppelt so lange wie Schleife 2 zur Ausführung.Warum ist das Schleifen von range() in Python schneller als mit einer while-Schleife?
Loop 1:
int i = 0
while i < 100000000:
i += 1
Loop 2:
for n in range(0,100000000):
pass
Warum ist die erste Schleife so viel langsamer? Ich weiß, es ist ein triviales Beispiel, aber es hat mein Interesse geweckt. Gibt es etwas Besonderes an der Funktion range(), die es effizienter macht, als eine Variable auf die gleiche Weise zu inkrementieren?
+1 für die Erklärung einer Antwort mit einer Demontage – TwentyMiles
Eigentlich hat die Schleife Körper in der ersten Demontage 10 Operationen (der Sprung von Position 32 bis 9).In der aktuellen CPython-Implementierung resultiert die Interpretation jedes Bytecodes mit einer ziemlich hohen Wahrscheinlichkeit in einer kostspieligen indirekten Verzweigungsfehlvorhersage in der CPU (der Sprung zur Implementierung des nächsten Bytecodes). Dies ist eine Konsequenz der aktuellen Implementierung von CPython, wobei die JITs, die durch unbeladenes Schlucken, PyPy und andere implementiert werden, höchstwahrscheinlich diesen Overhead verlieren werden. Die besten von ihnen werden auch in der Lage sein, Typspezialisierung für eine Größenordnung Beschleunigung zu tun. –
+1 - @kcwu: Wie hast du es zerlegt? –