Beide vermeiden # 1 und # 3 x ** y
neu berechnet, wobei # 2 zweimal berechnen muss.
Auf Python 2, # 3 wird schrecklich sein, weil es den gesamten Inhalt der range
berechnen muss. Auf Python 3.2+, muss es nicht (range
ist smart, und kann mathematisch korrekt bestimmen, ob eine int
in der range
erscheint, ohne tatsächlich zu iterieren, in konstanter Zeit), aber es ist bestenfalls gleich # 1, seit der Erstellung der range
Objekt hat überhaupt etwas Overhead.
Wie tobias_k
erwähnt in den Kommentaren, wenn x ** y
ein float
erzeugt, # 3 wird langsamer sein (unterbricht den Python 3.2 + O(1)
Mitgliedschaft Testoptimierung, eine implizite Schleife über alle Werte erfordern), und andere Ergebnisse als # 1 erhalten und # 2, wenn der Wert keinem int
Wert in range
entspricht. Das heißt, das Testen 3.5 in range(1, 5)
gibt False
zurück und muss 3.5
gegen 1
, 2
, 3
und 4
einzeln überprüfen, bevor es Ihnen sogar so viel sagen kann.
Im Grunde, bleiben Sie auf # 1, es wird die einzige sein, die redundante Berechnungen vermeidet und vermeidet, eine Tonne von Werten für den Vergleich auf Py 2 und Py3 zu erstellen. # 3 wird nicht viel (wenn überhaupt) langsamer auf Python 3.2+ sein, aber es beinhaltet das Erstellen eines range
Objekts, das hier nicht benötigt wird, und wird nicht ganz logisch äquivalent sein.
Haben Sie daran gedacht, es zu testen? 1 wäre eindeutig effizienter als 2, da "x ** y" nur einmal ausgewertet wird, und ich würde annehmen, dass der Aufruf "Bereich" in 3 es langsamer machen würde, wenn Sie es nicht ausrechnen könnten, aber ** Sie könnten dies bestätigen **, mit z "Zeit". – jonrsharpe
Hast du eine Zeitmessung gemacht? – MSeifert
da alle 3 sind nicht zu kompliziert zu implementieren Ich werde sie alle versuchen und überprüfen Sie die Ergebnisse –