Myślę, że tutaj odpowiedź jest nieco bardziej subtelna niż sugerują inne odpowiedzi, chociaż jej istota jest poprawna: pętla for jest szybsza, ponieważ więcej operacji odbywa się w C, a mniej w Pythonie .
Mówiąc dokładniej, w przypadku pętli for w C zachodzą dwie rzeczy, które w pętli while są obsługiwane w Pythonie:
W pętli while porównanie i < 100000000
jest wykonywane w Pythonie, podczas gdy w pętli for zadanie jest przekazywane do iteratora programu range(100000000)
, który wewnętrznie wykonuje iterację (a zatem sprawdza granice) w C.
W pętli while aktualizacja pętli i += 1
odbywa się w Pythonie, podczas gdy w pętli for ponownie iterator range(100000000)
, napisany w C, wykonuje i+=1
(lub ++i
).
Widzimy, że jest to połączenie obu tych rzeczy, które przyspiesza pętlę for, dodając je ręcznie, aby zobaczyć różnicę.
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()
Próbowałem tego zarówno z liczbą 100000000 jako stałą, jak i zmienną, N
co byłoby bardziej typowe.
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
Jak widać, w obu przypadkach while
czas jest bardzo zbliżony do różnicy for inc+test
i for pure
. Zauważ również, że w przypadku, gdy używamy N
zmiennej, while
ma dodatkowe spowolnienie w celu wielokrotnego sprawdzania wartości N
, ale for
nie.
To naprawdę szalone, że takie trywialne modyfikacje mogą skutkować ponad 3-krotnym przyspieszeniem kodu , ale to właśnie Python dla Ciebie. I nawet nie zaczynaj od tego, kiedy w ogóle możesz użyć wbudowanego na pętli ....