podría obtener un mejor momento que el enfoque de enumeración/generador usando itertools; Creo que itertools proporciona implementaciones más rápidas de los algoritmos subyacentes, para los creadores de rendimiento en todos nosotros. Pero bisect puede ser aún más rápido.
from itertools import islice, dropwhile
threshold = 5
seq = [1,4,6,9,11]
first_val = islice(dropwhile(lambda x: x<=threshold, seq),0,1)
result = seq.index(first_val)
me pregunto acerca de la diferencia entre el enfoque bisect se muestra aquí y con el listado para su pregunta en los ejemplos doc, por lo que modismo/velocidad. Muestran un enfoque para encontrar el valor, pero truncado en la primera línea, devuelve el índice. Supongo que, dado que se llama "bisect_right" en lugar de "bisect", probablemente solo se ve desde una dirección. Dado que su lista está ordenada y desea mayor que, esta podría ser la mejor economía de búsqueda.
from bisect import bisect_right
def find_gt(a, x):
'Find leftmost value(switching this to index) greater than x'
return bisect_right(a, x)
Interesante pregunta.
El segundo sería más rápido sin la enumeración, usando solo un bucle simple y retornando list.index(). Pero en ninguna parte cerca de la solución de bisección. – rplnt
@rplnt - gracias, lo he agregado a la comparación. Tienes razón, es más rápido que el enumerate. – eumiro