Tl;dr
for first_item in muh_set: break
bleibt der optimale Ansatz in Python 3.x. Verflucht seist du, Guido.
Warum tun Sie das?
Willkommen zu einem weiteren Satz von Python 3.x Timings, extrapoliert von wr. Der ausgezeichnete Python 2.x-spezifische Antwort . Anders als AChampion ist ebenso hilfreich Python 3.x-spezifische Antwort die nachstehenden Zeitangaben también die oben vorgeschlagenen Lösungen für Zeitausreißer - einschließlich:
Code-Schnipsel für große Freude
Einschalten, abstimmen, Zeit einstellen:
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 verdrängte zeitlose Zeitabläufe
Seht her! Geordnet nach schnellsten bis langsamsten Snippets:
$ ./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
Faceplants für die ganze Familie
Das ist nicht überraschend, die manuelle Iteration bleibt mindestens doppelt so schnell als die nächst schnellere Lösung. Obwohl sich der Abstand zu den Tagen von Bad Old Python 2.x (in denen die manuelle Iteration mindestens viermal so schnell war) verringert hat, enttäuscht er die PEP 20 Eiferer in mir, dass die ausführlichste Lösung die beste ist. Zumindest die Umwandlung einer Menge in eine Liste, nur um das erste Element der Menge zu extrahieren, ist so schrecklich wie erwartet. Danke Guido, möge sein Licht uns weiterhin leiten.
Überraschenderweise ist die Die RNG-basierte Lösung ist absolut furchtbar. Listenkonvertierung ist schlecht, aber random
vraiment nimmt den Kuchen der schrecklichen Soße. So viel zum Gott der Zufallszahlen .
Ich wünschte nur, dass die amorphen Sie würden PEP up a set.get_first()
Methode für uns bereits. Wenn Sie das lesen, sie: "Bitte. Tun Sie etwas."
39 Stimmen
Weiß jemand, warum Python diese Funktion nicht bereits implementiert hat?
7 Stimmen
Was ist der Anwendungsfall? Set hat diese Fähigkeit aus einem bestimmten Grund nicht. Sie sollen durch sie iterieren und Set-bezogene Operationen durchführen wie
union
usw., ohne Elemente daraus zu entnehmen. Zum Beispielnext(iter({3,2,1}))
gibt immer zurück1
Wenn Sie also dachten, dass dies ein zufälliges Element zurückgeben würde - das stimmt nicht. Vielleicht verwenden Sie also einfach die falsche Datenstruktur? Was ist der Anwendungsfall?1 Stimmen
Verwandt: stackoverflow.com/questions/20625579/ (Ich weiß, es ist nicht dieselbe Frage, aber es gibt lohnende Alternativen und Einsichten).
1 Stimmen
@hlin117 Denn Set ist ein unsortierte Sammlung . Da keine Reihenfolge erwartet wird, macht es keinen Sinn, ein Element an einer bestimmten Position abzurufen - es wird erwartet, dass es zufällig ist.
2 Stimmen
@hlin117 Warum macht das dann keinen Sinn? Es heißt "Zeichnen mit Ersatz"...
0 Stimmen
Ich denke, das Problem ist, dass die Werte nicht nach dem Zufallsprinzip zurückgegeben werden und sie nicht den Eindruck erwecken wollen, dass dies der Fall ist. Wahrscheinlich wäre die echte Zufälligkeit ein zu großer Aufwand. Aber für Testzwecke wäre es dennoch einfach, einige
.get()
Funktion oder so...1 Stimmen
B = (a-set()).pop()
0 Stimmen
@Necho: I Liebe diese!!! Könnte man auch einfach machen:
set(a).pop()
?1 Stimmen
@DarenThomas Ich bin kein Experte für Python. Was ich weiß, ist, dass die Zeitkomplexität bei der Verwendung von set(a) O(len(a)) ist, also das Gleiche wie bei copy(). Im Falle der Differenz s-t ist die Zeitkomplexität O(len(t)), was in meinem Beispiel Null ist, aber vielleicht erzeugt die Operation (...).pop() intern eine Kopie, ich weiß es nicht. Das ist etwas, das uns ein Experte sagen könnte :)
4 Stimmen
Ein sinnvoller Anwendungsfall, auf den ich immer wieder stoße, ist dieser: Ich schreibe einen Test und erhalte eine Menge. Ich möchte jeden Wert darin betrachten, um weitere Daten für den Test zu erstellen. Es ist mir egal, welchen Wert ich erhalte, und es ist mir auch egal, ob es jedes Mal derselbe oder ein anderer ist. Ich brauche nur a Wert aus der Menge.