Stavo cercando un modo veloce per fare l'argomento, quindi ho fatto alcuni esperimenti con modi suggeriti. E sono rimasto sorpreso dai risultati, quindi voglio condividerlo con te.
Gli esperimenti sono stati fatti usando pythonbenchmark strumento e con
a = range(1,50000) # Source list
b = range(1,15000) # Items to remove
Risultati:
def comprehension(a, b):
return [x for x in a if x not in b]
5 tentativi, tempo medio di 12.8 sec
def filter_function(a, b):
return filter(lambda x: x not in b, a)
5 tentativi, tempo medio di 12.6 sec
def modification(a,b):
for x in b:
try:
a.remove(x)
except ValueError:
pass
return a
5 tentativi, tempo medio 0,27 sec
def set_approach(a,b):
return list(set(a)-set(b))
5 tentativi, tempo medio 0,0057 sec
Inoltre ho fatto un'altra misura con dimensioni ingressi più grandi per le ultime due funzioni
a = range(1,500000)
b = range(1,100000)
E i risultati:
Per modifica (rimuovere metodo) - tempo medio è di 252 secondi per l'approccio set - il tempo medio è di 0,75 secondo
Così si può vedere che l'approccio con i set è significativamente più velocemente di altri. Sì, non conserva oggetti simili, ma se non ne hai bisogno, è per te. E non c'è quasi nessuna differenza tra la comprensione degli elenchi e l'uso della funzione filtro. L'uso di "Rimuovi" è ~ 50 volte più veloce, ma modifica l'elenco delle fonti. E la scelta migliore è usare i set: è più di 1000 volte più veloce della comprensione delle liste!
Cosa succede se ho una lista '[1,2,2,2,3,4]' e una sottolista '[2,3]', quindi il risultato dovrebbe essere '[1,2,2,4 ] ', esiste un modo Python per farlo? – user
@user questo ti dà la maggior parte del modo lì - ma il tuo problema è un altro problema! l = [1,2,2,3,4] sl = [2,3] [x per x in [l [n: n + 2] per n nell'intervallo (0, len (l)) [ :: 2]] se x! = Sl] – jsh