tl; dr
for first_item in muh_set: break
bleibt der optimale Ansatz in Python 3.x. Verfluche dich, Guido.
Du machst das
Willkommen zu einem weiteren Satz von Python 3.x-Timings, extrapoliert aus wr. 's ausgezeichnete Python 2.x-spezifische Antwort . Im Gegensatz zu AChampions ebenso hilfreicher Python 3.x-spezifischer Antwort werden in den folgenden Zeitabläufen auch die oben vorgeschlagenen Zeitausreißerlösungen aufgeführt - einschließlich:
Code-Schnipsel für große Freude
Einschalten, einschalten, zeitlich festlegen:
from timeit import Timer
stats = [
"for i in range(1000): \n\tfor x in s: \n\t\tbreak",
"for i in range(1000): next(iter(s))",
"for i in range(1000): s.add(s.pop())",
"for i in range(1000): list(s)[0]",
"for i in range(1000): random.sample(s, 1)",
]
for stat in stats:
t = Timer(stat, setup="import random\ns=set(range(100))")
try:
print("Time for %s:\t %f"%(stat, t.timeit(number=1000)))
except:
t.print_exc()
Schnell veraltete zeitlose Timings
Erblicken! Sortiert nach schnellsten bis langsamsten Schnipsel:
$ ./test_get.py
Time for for i in range(1000):
for x in s:
break: 0.249871
Time for for i in range(1000): next(iter(s)): 0.526266
Time for for i in range(1000): s.add(s.pop()): 0.658832
Time for for i in range(1000): list(s)[0]: 4.117106
Time for for i in range(1000): random.sample(s, 1): 21.851104
Gesichtspflanzen für die ganze Familie
Es überrascht nicht, dass die manuelle Iteration mindestens doppelt so schnell bleibt wie die nächstschnellste Lösung. Obwohl sich die Lücke seit den Tagen von Bad Old Python 2.x verringert hat (in denen die manuelle Iteration mindestens viermal so schnell war), enttäuscht es den PEP 20- Fanatiker in mir, dass die ausführlichste Lösung die beste ist. Zumindest das Konvertieren eines Sets in eine Liste, um nur das erste Element des Sets zu extrahieren, ist so schrecklich wie erwartet. Danke Guido, möge sein Licht uns weiterhin führen.
Überraschenderweise ist die RNG-basierte Lösung absolut schrecklich. Listenkonvertierung ist schlecht, nimmt aber random
wirklich den schrecklichen Saucen-Kuchen. Soviel zum Zufallszahlengott .
Ich wünschte nur, die Amorphen würden set.get_first()
bereits eine Methode für uns entwickeln. Wenn Sie dies lesen, sagen sie: "Bitte. Tun Sie etwas."