Python - Leistung mit globalen Variablen lokalen vs
Ich bin noch neu in Python, und ich habe versucht Sie zur Verbesserung der Leistung von meinem Python-Skript, also getestet habe ich es mit und ohne Globale Variablen. Ich zeitlich es, und zu meiner überraschung lief es schneller mit globalen Variablen deklariert, sondern als vorübergehende lokale vars Funktionen. Was ist Los? Ich dachte, die Ausführungsgeschwindigkeit war schneller mit lokalen Variablen? (Ich weiß, globals sind nicht sicher, ich bin immer noch neugierig.)
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einheimischen schneller sein soll
Laut diese Seite auf locals und globals:
Basiert auf, der, ich würde davon ausgehen, dass die lokalen Variablen sind in der Regel schneller. Meine Vermutung ist, was Sie sehen, ist etwas besonderes über Ihre Schrift.
Einheimischen sind schneller
Hier ist ein triviales Beispiel für die Verwendung einer lokalen variable, die dauert etwa 0,5 Sekunden auf meiner Maschine (0.3 in Python 3):
Und die Globale version, das dauert etwa 0,7 (0,5 in Python 3):
global
macht etwas komisch an Variablen, die bereits globalInteressant, diese version läuft in 0,8 Sekunden:
Während diese läuft in 0,9:
Werden Sie feststellen, dass in beiden Fällen
x
ist eine Globale variable (da es keine Funktionen), und Sie sind beide langsamer als die einheimischen. Ich habe keine Ahnung, warum deklarierenglobal x
half in diesem Fall.Diese Verrücktheit kommt nicht in Python 3 (beide Versionen nehmen etwa 0,6 Sekunden).
Bessere Optimierung Methoden
Wenn Sie möchten, optimieren Sie Ihr Programm, das beste, was Sie tun können, ist Profil. Dies wird Ihnen sagen, was nimmt die meiste Zeit, so Sie konzentrieren können auf, die. Ihr Prozess sollte so etwas wie:
Zeit, dass Sie nicht darunter ist der Programmierer Zeit damit verbracht das aufspüren des bugs erstellt, wenn Sie eine Globale eine Nebenwirkung hat irgendwo in Ihrem Programm. Diese Zeit ist ein Vielfaches größer als der Zeitaufwand für das erstellen und freigeben von lokalen Variablen,
Einfache Antwort:
Aufgrund Python ' s dynamische Natur, wenn der interpreter auf eine Ausdruck wie ein.b.c, sieht es aus einer (ersten Versuch der lokalen Namensraum, dann der Globale namespace, und schließlich die built-in-namespace), dann sieht es aus in das Objekt-namespace um den Namen aufzulösen, b, und schließlich sieht es das Objekt-namespace, um den Namen aufzulösen. c. Diese Suchvorgänge sind ziemlich schnell; Für die lokalen Variablen, lookups sind extrem schnell, da der interpreter weiß, welche Variablen sind lokal und können ordnen Sie einer bekannten position im Speicher.
Interpreter weiß, welche Namen innerhalb Ihre Funktionen sind lokale und ordnet Sie bestimmten (bekannten) Standorten innerhalb der Funktion rufen Sie den Speicher. Diese Verweise zu den einheimischen viel schneller als zu globals und (vor allem) zu built-ins.
Code-Beispiel zu erklären:
Wenn Python erstellt eine Funktion, die Funktion kennt, bevor Sie aufgerufen wird, wenn die Variablen in es sind einheimische, Verschlüsse oder globals.
Wir haben mehrere Möglichkeiten der Referenzierung von Variablen in Funktionen:
So erstellen wir diese Arten von Variablen in ein paar verschiedene Funktionen, so können wir für uns selbst sehen:
Wieder
Können wir sehen, dass jede Funktion weiß, wo die variable - es muss nicht so zur Laufzeit:
Können wir sehen, dass derzeit der byte-code für eine Globale ist
LOAD_GLOBAL
, eine closure-variable istLOAD_DEREF
und eine lokale istLOAD_FAST
. Dies sind die details der Implementierung der CPython, und ändern kann sich von version zu version, aber es ist nützlich, um in der Lage zu sehen, dass Python behandelt jede variable lookup anders.Einfügen in ein interpreter und sehen Sie selbst:
Test-code
Test-code (fühlen Sie sich frei, um die Installation auf Ihrem system testen):
Ausgabe
Auf Windows, zumindest in diesem build, wie es aussieht, Verschlüsse ein bisschen eine Strafe - und mit einem lokalen, dass das ein Standard ist die Schnellste, weil Sie nicht die Zuordnung von lokalen jeder Zeit:
Unter Linux:
Werde ich hinzufügen, andere Systeme habe ich eine chance Sie zu testen.