Se ho un elenco python che ha molti duplicati e voglio scorrere ogni elemento, ma non attraverso i duplicati, è meglio usare un set (come in set(mylist)
, o trovare un altro modo per creare un elenco senza duplicati? stavo pensando di appena scorrendo la lista e il controllo dei duplicati, ma ho pensato che è quello che set()
fa quando è inizializzato.Migliore/Più veloce per passare da un set o un elenco?
Quindi, se mylist = [3,1,5,2,4,4,1,4,2,5,1,3]
e ho davvero voglia di scorrere [1,2,3,4,5]
(ordine non importa), dovrei usare set(mylist)
o qualcos'altro?
Un'alternativa è possibile nell'ultimo esempio, poiché l'elenco contiene ogni numero intero tra il suo minimo e il mio valore dell'asse, ho potuto passare attraverso range(min(mylist),max(mylist))
o tramite set(mylist)
. Dovrei in generale cercare di evitare l'uso del set in questo caso? Inoltre, trovare min
e è più lento della semplice creazione di set
?
Nel caso nell'ultimo esempio, il set
è più veloce:
from numpy.random import random_integers
ids = random_integers(1e3,size=1e6)
def set_loop(mylist):
idlist = []
for id in set(mylist):
idlist.append(id)
return idlist
def list_loop(mylist):
idlist = []
for id in range(min(mylist),max(mylist)):
idlist.append(id)
return idlist
%timeit set_loop(ids)
#1 loops, best of 3: 232 ms per loop
%timeit list_loop(ids)
#1 loops, best of 3: 408 ms per loop
Perché non provarlo? –
@JoelCornett done :) – askewchan
Ti aspetti che questa differenza di velocità sia importante in qualsiasi programma tu scriva mai? Mantenere le cose in 'numpy', usando un genexp invece di costruire un' lista' di milioni di elementi solo per iterare (e usare 'xrange' invece di' range' se questo è Py2), cercando di fare loop stretti in C di Python (ad esempio, 'idlist = range (...)' invece di un ciclo 'for' che fa la stessa cosa), ecc. tutti renderanno gli ordini di grandezza più differenti. – abarnert