tl; dr
for first_item in muh_set: break
rimane l'approccio ottimale in Python 3.x. Ti maledico, Guido.
fai questo
Benvenuti in un altro set di timing Python 3.x, estrapolato da wr. 's eccellente risposta 2.x-specifica Python . A differenza della altrettanto utile risposta specifica di Python 3.x di AChampion , i tempi di seguito indicati sono anche soluzioni temporanee suggerite sopra, tra cui:
Snippet di codice per una grande gioia
Accendi, sintonizza, cronometra:
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()
Tempi senza tempo rapidamente obsoleti
Ecco! Ordinato per frammenti dal più veloce al più lento:
$ ./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 per tutta la famiglia
Non sorprende che l'iterazione manuale rimanga almeno due volte più veloce della soluzione più veloce successiva. Sebbene il divario sia diminuito dai giorni Bad Old Python 2.x (in cui l'iterazione manuale era almeno quattro volte più veloce), delude lo zelo di PEP 20 in me che la soluzione più prolissa è la migliore. Almeno convertire un set in un elenco solo per estrarre il primo elemento del set è orribile come previsto. Grazie a Guido, possa la sua luce continuare a guidarci.
Sorprendentemente, la soluzione basata su RNG è assolutamente orribile. La conversione della lista è cattiva, ma prende random
davvero la torta con salsa terribile. Questo per quanto riguarda il Dio numero casuale .
Vorrei solo che gli amorfi avrebbero già elaborato un set.get_first()
metodo per noi. Se stai leggendo questo, loro: "Per favore. Fai qualcosa."