Ich denke, die Antwort hier ist etwas subtiler als die anderen Antworten vermuten lassen, obwohl das Wesentliche richtig ist: Die for-Schleife ist schneller, weil mehr Operationen in C und weniger in Python stattfinden .
Im Fall der for-Schleife passieren in C zwei Dinge, die in der while-Schleife in Python behandelt werden:
In der while-Schleife wird der Vergleich i < 100000000
in Python ausgeführt, während in der for-Schleife der Job an den Iterator von übergeben wird range(100000000)
, der intern die Iteration (und damit die Überprüfung der Grenzen) in C durchführt.
In der while-Schleife erfolgt die Aktualisierung der Schleife i += 1
in Python, während in der for-Schleife der range(100000000)
in C geschriebene Iterator von i+=1
(oder ++i
) erneut ausgeführt wird.
Wir können sehen, dass es eine Kombination dieser beiden Dinge ist, die die for-Schleife schneller macht, indem sie manuell wieder hinzugefügt werden, um den Unterschied zu erkennen.
import timeit
N = 100000000
def while_loop():
i = 0
while i < N:
i += 1
def for_loop_pure():
for i in range(N):
pass
def for_loop_with_increment():
for i in range(N):
i += 1
def for_loop_with_test():
for i in range(N):
if i < N: pass
def for_loop_with_increment_and_test():
for i in range(N):
if i < N: pass
i += 1
def main():
print('while loop\t\t', timeit.timeit(while_loop, number=1))
print('for pure\t\t', timeit.timeit(for_loop_pure, number=1))
print('for inc\t\t\t', timeit.timeit(for_loop_with_increment, number=1))
print('for test\t\t', timeit.timeit(for_loop_with_test, number=1))
print('for inc+test\t', timeit.timeit(for_loop_with_increment_and_test, number=1))
if __name__ == '__main__':
main()
Ich habe dies sowohl mit der Zahl 100000000 als Literalkonstante als auch mit einer Variablen versucht, N
wie es typischer wäre.
while loop 3.5131139
for pure 1.3211338000000001
for inc 3.5477727000000003
for test 2.5209639
for inc+test 4.697028999999999
while loop 4.1298240999999996
for pure 1.3526357999999998
for inc 3.6060175
for test 3.1093069
for inc+test 5.4753364
Wie Sie sehen können, liegt die while
Zeit in beiden Fällen sehr nahe am Unterschied von for inc+test
und for pure
. Beachten Sie auch, dass in dem Fall, in dem wir die N
Variable verwenden, die while
eine zusätzliche Verlangsamung aufweist, um den Wert von wiederholt nachzuschlagen N
, die for
jedoch nicht.
Es ist wirklich verrückt, dass solche trivialen Änderungen zu einer über 3-fachen Code-Beschleunigung führen können , aber das ist Python für Sie. Und lass mich nicht einmal anfangen, wenn du überhaupt ein eingebautes über eine Schleife verwenden kannst ...