tl; dr
for first_item in muh_set: break
sigue siendo el enfoque óptimo en Python 3.x. Te maldigo, Guido.
haces esto
Bienvenido a otro conjunto de temporizaciones de Python 3.x, extrapolado de wr. 's excelente respuesta específica 2.x-Python . A diferencia de la respuesta específica de Python 3.x igualmente útil de AChampion , los tiempos a continuación también presentan soluciones atípicas sugeridas anteriormente, que incluyen:
Fragmentos de código para gran alegría
Enciende, sintoniza, 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()
Tiempos intemporales rápidamente obsoletos
¡Mirad! Ordenado por fragmentos más rápidos a más lentos:
$ ./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 para toda la familia
Como era de esperar, la iteración manual sigue siendo al menos el doble de rápida que la próxima solución más rápida. Aunque la brecha ha disminuido desde los días Bad Old Python 2.x (en los que la iteración manual fue al menos cuatro veces más rápida), decepciona al fanático de PEP 20 en mí que la solución más detallada es la mejor. Al menos convertir un conjunto en una lista solo para extraer el primer elemento del conjunto es tan horrible como se esperaba. Gracias Guido, que su luz continúe guiándonos.
Sorprendentemente, la solución basada en RNG es absolutamente horrible. La conversión de la lista es mala, pero random
realmente toma el pastel de salsa horrible. Esto en cuanto al Dios del número aleatorio .
Solo desearía que los amorfos set.get_first()
ya nos hicieran PEP un método. Si estás leyendo esto, ellos: "Por favor. Haz algo".