[edit: Diese Antwort richtet sich an die derzeit meistgewählte itertools.groupby
(was eine gute Antwort ist) später beantworten].
Ohne das Programm neu zu schreiben, ist die asymptotisch leistungsfähigste y am besten lesbar ist, lautet wie folgt:
all(x==myList[0] for x in myList)
(Ja, das funktioniert sogar mit einer leeren Liste! Das liegt daran, dass dies einer der wenigen Fälle ist, in denen Python eine faule Semantik hat.)
Dies wird zum frühestmöglichen Zeitpunkt fehlschlagen, so dass es asymptotisch optimal ist (die erwartete Zeit ist ungefähr O(#uniques) statt O(N), aber die Zeit im schlimmsten Fall immer noch O(N)). Dies setzt voraus, dass Sie die Daten vorher noch nicht gesehen haben...
(Wenn Ihnen die Leistung wichtig ist, Sie aber nicht so viel Wert auf die Leistung legen, können Sie zuerst die üblichen Standardoptimierungen durchführen, wie z.B. das Anheben des myList[0]
Konstante aus der Schleife zu entfernen und klobige Logik für den Randfall hinzuzufügen, obwohl dies etwas ist, was der Python-Compiler irgendwann lernen könnte, wie man es macht, und daher sollte man es nicht tun, wenn es nicht absolut notwendig ist, da es die Lesbarkeit für minimalen Gewinn zerstört).
Wenn Sie etwas mehr Wert auf Leistung legen, ist dies doppelt so schnell wie oben, aber etwas ausführlicher:
def allEqual(iterable):
iterator = iter(iterable)
try:
firstItem = next(iterator)
except StopIteration:
return True
for x in iterator:
if x!=firstItem:
return False
return True
Wenn Sie noch mehr Wert auf Leistung legen (aber nicht genug, um Ihr Programm neu zu schreiben), verwenden Sie die derzeit meistgewählte itertools.groupby
Antwort, die doppelt so schnell ist wie allEqual
weil es sich wahrscheinlich um optimierten C-Code handelt. (Laut der Dokumentation sollte es (ähnlich wie bei dieser Antwort) keinen Speicher-Overhead haben, da der Lazy-Generator nie in eine Liste ausgewertet wird... worüber man sich Sorgen machen könnte, aber der Pseudocode zeigt, dass die gruppierten "Listen" eigentlich Lazy-Generatoren sind).
Wenn Sie noch mehr Wert auf Leistung legen, lesen Sie weiter...
Nebenbemerkungen zur Leistung, da die anderen Antworten aus unerfindlichen Gründen davon sprechen:
... wenn Sie die Daten schon einmal gesehen haben und wahrscheinlich eine Art von Sammeldatenstruktur verwenden und Ihnen die Leistung wirklich wichtig ist, können Sie .isAllEqual()
umsonst O(1), indem Sie Ihre Struktur mit einer Counter
die bei jeder Einfügung/Löschung/etc. aktualisiert wird, und prüft nur, ob sie die Form {something:someCount}
d.h. len(counter.keys())==1
Alternativ können Sie auch einen Zähler in einer separaten Variablen aufbewahren. Dies ist nachweislich besser als alles andere bis zu einem konstanten Faktor. Vielleicht können Sie auch das FFI von Python mit ctypes
mit der von Ihnen gewählten Methode und vielleicht mit einer Heuristik (z. B. wenn es sich um eine Sequenz mit getitem , dann Prüfung des ersten Elements, des letzten Elements, dann der Elemente in der Reihenfolge).
Natürlich hat die Lesbarkeit auch etwas für sich.