Heim  >  Artikel  >  Backend-Entwicklung  >  Welche Methode der Python-Schleifen am schnellsten ist, kann Ihr Verständnis untergraben!

Welche Methode der Python-Schleifen am schnellsten ist, kann Ihr Verständnis untergraben!

王林
王林nach vorne
2023-04-17 23:10:011191Durchsuche

Wie wir alle wissen, ist Python keine effiziente Sprache. Darüber hinaus ist das Schleifen in jeder Sprache ein sehr zeitaufwändiger Vorgang. Wenn ein einfacher Einzelschrittvorgang eine Zeiteinheit in Anspruch nimmt und dieser Vorgang Zehntausende Male wiederholt wird, erhöht sich auch die letztendlich aufgewendete Zeit um das Zehntausendfache.

while und for sind zwei Schlüsselwörter, die häufig zum Implementieren von Schleifen in Python verwendet werden. Es gibt tatsächlich eine Lücke in ihrer Betriebseffizienz. Beispielsweise der folgende Testcode:

import timeit
def while_loop(n=100_000_000):
 ich = 0
 s = 0
 während ich <
 s += ich
 ich += 1
 Rückkehr s
def for_loop(n=100_000_000):
 s = 0
 für i im Bereich(n):
 s += ich
 Rückkehr s
def main():
 print('while looptt', timeit.timeit(while_loop, number=1))
 print('for looptt', timeit.timeit(for_loop, number=1))
if __name__ == '__main__':
 hauptsächlich()
# => while-Schleife 4.718853999860585
# => for-Schleife 3.211570399813354

Dies ist eine einfache Summenoperation, die die Summe aller natürlichen Zahlen von 1 bis n berechnet. Sie können sehen, dass die for-Schleife 1,5 Sekunden schneller ist als die while-Schleife.

Der Hauptunterschied liegt in den unterschiedlichen Mechanismen zwischen den beiden.

Während in jeder Schleife tatsächlich zwei Schritte mehr ausgeführt werden als für: Grenzen prüfen und Variable i inkrementieren. Das heißt, jedes Mal, wenn eine Schleife ausgeführt wird, führt while eine Grenzprüfung (while i < n) und eine Inkrementberechnung (i +=1) durch. Bei beiden Schritten handelt es sich um expliziten reinen Python-Code.

Die for-Schleife muss keine Grenzprüfungen und Inkrementierungsoperationen durchführen und fügt keinen expliziten Python-Code hinzu (reiner Python-Code ist weniger effizient als der zugrunde liegende C-Code). Wenn die Anzahl der Zyklen groß genug ist, entsteht eine erhebliche Effizienzlücke.

Sie können zwei weitere Funktionen hinzufügen, um unnötige Grenzprüfungen und Inkrementierungsberechnungen in der for-Schleife hinzuzufügen:

import timeit
def while_loop(n=100_000_000):
 ich = 0
 s = 0
 während ich <
 s += ich
 ich += 1
 Rückkehr s
def for_loop(n=100_000_000):
 s = 0
 für i im Bereich(n):
 s += ich
 Rückkehr s
def for_loop_with_inc(n=100_000_000):
 s = 0
 für i im Bereich(n):
 s += ich
 ich += 1
 Rückkehr s
def for_loop_with_test(n=100_000_000):
 s = 0
 für i im Bereich(n):
 wenn ich <
 passieren
 s += ich
 Rückkehr s
def main():
 print('while looptt', timeit.timeit(while_loop, number=1))
 print('for looptt', timeit.timeit(for_loop, number=1))
 print('for-Schleife mit Inkrementierung',
 timeit.timeit(for_loop_with_inc, number=1))
 print('for-Schleife mit testtt', timeit.timeit(for_loop_with_test, number=1))
if __name__ == '__main__':
 hauptsächlich()
# => while-Schleife 4.718853999860585
# => für Schleife 3.211570399813354
# => for-Schleife mit Inkrement 4.602369500091299
# => for-Schleife mit Test 4.18337869993411

Es ist ersichtlich, dass die hinzugefügte Grenzprüfung und die automatische Inkrementierungsoperation tatsächlich die Ausführungseffizienz der for-Schleife stark beeinflusst haben.

Wie bereits erwähnt, sind der zugrunde liegende Python-Interpreter und die integrierten Funktionen in der Sprache C implementiert. Die Ausführungseffizienz der C-Sprache ist viel höher als die von Python.

import timeit
def while_loop(n=100_000_000):
 ich = 0
 s = 0
 während ich <
 s += ich
 ich += 1
 Rückkehr s
def for_loop(n=100_000_000):
 s = 0
 für i im Bereich(n):
 s += ich
 Rückkehr s
def sum_range(n=100_000_000):
 Rückgabesumme(Bereich(n))
def main():
 print('while looptt', timeit.timeit(while_loop, number=1))
 print('for looptt', timeit.timeit(for_loop, number=1))
 print('sum rangett', timeit.timeit(sum_range, number=1))
if __name__ == '__main__':
 hauptsächlich()
# => while-Schleife 4.718853999860585
# => für Schleife 3.211570399813354
# => sum range0.8658821999561042

Es ist ersichtlich, dass sich die Ausführungseffizienz des Codes verdoppelt hat, nachdem die integrierte Funktion sum zum Ersetzen der Schleife verwendet wurde.

Die Akkumulationsoperation der integrierten Funktion sum ist eigentlich eine Schleife, wird jedoch in der Sprache C implementiert, während die Summenoperation in der for-Schleife von reinem Python ausgeführt wird Code s += wurde mir klar. C > Python.

Erweitern Sie Ihr Denken. Wir sind alle mit Geschichten über Gauss‘ geniale Berechnung der Summe der Zahlen 1 bis 100 aufgewachsen.Die Summe von 1…100 ist gleich (1 + 100) * 50. Diese Berechnungsmethode kann auch auf die obige Summationsoperation angewendet werden.

import timeit
def while_loop(n=100_000_000):
 ich = 0
 s = 0
 während ich <
 s += ich
 ich += 1
 Rückkehr s
def for_loop(n=100_000_000):
 s = 0
 für i im Bereich(n):
 s += ich
 Rückkehr s
def sum_range(n=100_000_000):
 Rückgabesumme(Bereich(n))
def math_sum(n=100_000_000):
 return (n * (n - 1)) // 2
def main():
 print('while looptt', timeit.timeit(while_loop, number=1))
 print('for looptt', timeit.timeit(for_loop, number=1))
 print('sum rangett', timeit.timeit(sum_range, number=1))
 print('math sumtt', timeit.timeit(math_sum, number=1))
if __name__ == '__main__':
 hauptsächlich()
# => while-Schleife 4.718853999860585
# => für Schleife 3.211570399813354
# => Summenbereich0,8658821999561042
# => math sum 2.400018274784088e-06

Die endgültige Ausführungszeit von math sum beträgt etwa 2,4e-6, was sich um das Millionenfache verkürzt. Der Grundgedanke dabei ist, dass ein Codeteil Hunderte Millionen Mal ausgeführt werden muss, da die Effizienz von Schleifen gering ist.

Machen Sie einfach keine Schleife und verwenden Sie mathematische Formeln, um Hunderte Millionen Schleifenoperationen in nur einem Schritt umzuwandeln. Die Effizienz wurde natürlich wie nie zuvor gesteigert.

Abschließendes Fazit (ein bisschen Riddler):

Der schnellste Weg, eine Schleife zu implementieren - - — ——Verwenden Sie einfach keine Schleifen

Verwenden Sie für Python so weit wie möglich integrierte Funktionen, um den reinen Python-Code in der Schleife zu minimieren.

Das obige ist der detaillierte Inhalt vonWelche Methode der Python-Schleifen am schnellsten ist, kann Ihr Verständnis untergraben!. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen