Was ist der Grund für die befürwortende Verwendung der for i in xrange(...)
-Stil Schleifenkonstrukte in Python? Für einfache Integer-Schleifen ist der Unterschied in den Gemeinkosten beträchtlich. Ich führte einen einfachen Test mit zwei Stücken Code:Rational hinter Python ist für Syntax bevorzugt
Datei idiomatic.py
:
#!/usr/bin/env python
M = 10000
N = 10000
if __name__ == "__main__":
x, y = 0, 0
for x in xrange(N):
for y in xrange(M):
pass
Datei cstyle.py
:
#!/usr/bin/env python
M = 10000
N = 10000
if __name__ == "__main__":
x, y = 0, 0
while x < N:
while y < M:
y += 1
x += 1
Profil Ergebnisse waren wie folgt:
bash-3.1$ time python cstyle.py
real 0m0.109s
user 0m0.015s
sys 0m0.000s
bash-3.1$ time python idiomatic.py
real 0m4.492s
user 0m0.000s
sys 0m0.031s
ich kann verstehe, warum die Pythonic-Version langsamer ist - ich stelle es mir vor hat viel damit zu tun, xrange N mal anzurufen, vielleicht könnte das eliminiert werden, wenn es einen Weg gibt, einen Generator zurückzuspulen. Aber warum sollte man bei dieser Differenz in der Ausführungszeit lieber die Pythonic-Version verwenden?
Edit: führte ich die Tests erneut den Code mit Herrn Martelli zur Verfügung gestellt, und die Ergebnisse waren in der Tat besser jetzt:
Ich dachte, ich die Ergebnisse hier aus dem Thread aufzählen würde:
1) Viel Code im Modulbereich ist eine schlechte Idee, auch wenn der Code in einem if __name__ == "__main__":
Block eingeschlossen ist.
2) * Merkwürdiger, den Code zu modifizieren, die thebadone
meine falsche Version gehörte (lassen y ohne Zurücksetzen) erzeugte wenig Unterschied in der Leistung wachsen, auch für größere Werte von M und N.
Ihr Timing ist fehlerhaft, denke ich. Führen Sie mehrere Versuche, und vielleicht haben einige Berechnungen tatsächlich durchgeführt, um jede mögliche Optimierung aus der Schleife loszuwerden – Yuliy
+1 Sehr interessante Frage. Nachdem ich Martinellis Antwort gelesen habe, ist diese Frage für mich noch interessanter, weil sie die feinen Unterschiede zwischen dem Aufruf eines Stücks Code innerhalb und außerhalb einer Funktion zeigt. – OscarRyz
-1: Da die Basis für die Frage grundsätzlich falsch war, würden Sie bitte die Frage schließen. –