Warum ist die Rekursion in Python so langsam?

8

Ich habe also im Leerlauf mit Rekursion herumgespielt, und mir ist aufgefallen, dass eine Rekursionsschleife viel langsamer ist als eine normale While-Schleife, und ich frage mich, ob jemand wüsste warum. Ich habe die Tests eingeschlossen, die ich unten gemacht habe:

%Vor%

Während des letzten Tests habe ich jedoch festgestellt, dass, wenn ich die else -Anweisung weggenommen habe, eine leichte Verbesserung der Geschwindigkeit gezeigt hat, also frage ich mich, ob die if-Anweisung die Ursache für diese Geschwindigkeitsdifferenz ist?

    
IT Ninja 24.11.2012, 16:18
quelle

2 Antworten

13

Sie haben Ihre Funktion als tail recursive geschrieben. In vielen imperativen und funktionalen Sprachen würde dies die Eliminierung der Tail-Rekursion auslösen, wobei der Compiler die CALL / RETURN-Befehlsfolge durch einen einfachen JUMP ersetzt, was den Prozess mehr oder weniger zur Iteration macht, im Gegensatz zur normalen Stapelrahmenzuordnung Overhead von rekursiven Funktionsaufrufen. Python verwendet jedoch keine Tail Recursion Elimination, wie in einigen dieser Links erklärt:

Ссылка

Ссылка

Wie Sie aus den Links sehen können, gibt es Gründe dafür, dass es nicht standardmäßig existiert, und Sie können es auf verschiedene Arten hacken, aber standardmäßig preist Python mithilfe von Generatorfunktionen komplizierte Sequenzen von Anweisungen, gegen die Rekursion.

    
acjay 24.11.2012, 16:48
quelle
3

Rekursion ist im Vergleich zur Iteration (im Allgemeinen) ziemlich teuer, weil sie die Zuweisung eines neuen Stapelrahmens erfordert.

    
Anoop Vaidya 24.11.2012 16:20
quelle