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 < 100000000in 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 += 1in 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, Nwie 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 whileZeit in beiden Fällen sehr nahe am Unterschied von for inc+testund for pure. Beachten Sie auch, dass in dem Fall, in dem wir die NVariable verwenden, die whileeine zusätzliche Verlangsamung aufweist, um den Wert von wiederholt nachzuschlagen N, die forjedoch 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 ...