Il modo più veloce per controllare se un valore esiste in una lista
Qual è il modo più veloce per sapere se un valore esiste in una lista (una lista con milioni di valori) e qual è il suo indice?
So che tutti i valori della lista sono unici come in questo esempio.
Il primo metodo che provo è (3,8 sec nel mio codice reale):
a = [4,2,3,1,5,6]
if a.count(7) == 1:
b=a.index(7)
"Do something with variable b"
Il secondo metodo che provo è (2 volte più veloce: 1,9 sec per il mio codice reale):
a = [4,2,3,1,5,6]
try:
b=a.index(7)
except ValueError:
"Do nothing"
else:
"Do something with variable b"
Metodi proposti dall'utente Stack Overflow (2,74 sec per il mio codice reale):
a = [4,2,3,1,5,6]
if 7 in a:
a.index(7)
Nel mio codice reale, il primo metodo richiede 3,81 sec e il secondo metodo richiede 1,88 sec. È un buon miglioramento, ma:
Sono un principiante con Python/scripting, e c'è un modo più veloce per fare le stesse cose e risparmiare più tempo di elaborazione?
Spiegazione più specifica per la mia applicazione:
Nell'API di Blender posso accedere a una lista di particelle:
particles = [1, 2, 3, 4, etc.]
Da lì, posso accedere alla posizione di una particella:
particles[x].location = [x,y,z]
E per ogni particella verifico se esiste un vicino cercando la posizione di ogni particella in questo modo:
if [x+1,y,z] in particles.location
"Find the identity of this neighbour particle in x:the particle's index
in the array"
particles.index([x+1,y,z])
Il modo più chiaro e veloce per farlo.
Puoi anche considerare di usare un
set
, ma costruire quell'insieme dalla tua lista potrebbe richiedere più tempo di quanto il test di appartenenza più veloce risparmierebbe. L'unico modo per essere certi è fare un buon benchmark. (questo dipende anche da quali operazioni si richiedono)Potresti mettere i tuoi elementi in un
set
. I set lookup sono molto efficienti.Prova:
edit In un commento dici che ti piacerebbe ottenere l'indice dell'elemento. Sfortunatamente, gli insiemi non hanno alcuna nozione di posizione degli elementi. Un'alternativa è pre-ordinare la tua lista e poi usare la ricerca binaria ogni volta che hai bisogno di trovare un elemento.
Utilizzo
Credo che questo sia il modo più veloce per sapere se un valore scelto è in un array.