si potrebbe ottenere un tempo migliore rispetto al/approccio generatore enumerate utilizzando itertools; Penso che itertools fornisca implementazioni più veloci degli algoritmi sottostanti, per i venditori di prestazioni in tutti noi. Ma il bisect potrebbe essere ancora più veloce.
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)
mi chiedo circa la differenza tra l'approccio bisect mostrato qui e quello elencato per la tua domanda negli esempi doc, per quanto linguaggio/velocità. Mostrano un approccio per trovare il valore, ma troncato in prima linea, restituisce l'indice. Immagino che dal momento che si chiama "bisect_right" invece di "bisect", probabilmente guarda solo da una direzione. Dato che la tua lista è ordinata e vuoi maggiore di, questa potrebbe essere la più grande economia di ricerca.
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)
Interessante domanda.
Il secondo sarebbe più veloce senza l'enumerazione, utilizzando solo un semplice ciclo e restituendo list.index(). Ma da nessuna parte vicino alla soluzione bisettrice. – rplnt
@ rplnt - grazie, l'ho aggiunto al confronto. Hai ragione, è più veloce dell'enumerazione. – eumiro