Wenn ich eine Python-Liste habe, die viele Duplikate enthält, und ich möchte durch jedes Element, aber nicht durch die Duplikate iterieren, ist es am besten, eine Menge zu verwenden (wie in set(mylist)
, oder finde eine andere Möglichkeit, eine Liste ohne zu erstellen Duplikate? ich dachte nur durch die Liste Looping und Überprüfung auf Duplikate aber ich dachte, das ist, was set()
tut, wenn es initialisiert wird.Besser/schneller zu Loop-Set oder Liste?
Also, wenn mylist = [3,1,5,2,4,4,1,4,2,5,1,3]
und ich möchte wirklich nur eine Schleife durch [1,2,3,4,5]
(Reihenfolge spielt keine Rolle), sollte ich set(mylist)
oder etwas anderes verwenden?
Eine Alternative ist im letzten Beispiel möglich, da die Liste jede ganze Zahl zwischen ihrem min und m enthält ax Wert, ich könnte durch range(min(mylist),max(mylist))
oder set(mylist)
durchlaufen. Sollte ich generell versuchen, in diesem Fall die Verwendung von Set zu vermeiden? Würden Sie die min
und max
langsamer finden, als nur die set
zu erstellen?
In dem Fall, in dem letzten Beispiel ist die set
schneller:
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
Warum es nicht testen? –
@JoelCornett fertig :) – askewchan
Erwarten Sie, dass dieser Geschwindigkeitsunterschied tatsächlich in jedem Programm eine Rolle spielt, das Sie jemals schreiben? Halten Sie die Dinge in "numpy", mit einem Genxp anstatt eine Millionen-Element 'liste' zu erstellen, nur um zu iterieren (und' xrange' anstelle von 'range' zu verwenden, wenn dies Py2 ist), stattdessen versuchen, enge Schleifen in C zu machen von Python (z. B. "idlist = range (...)" anstelle einer "for" -Schleife, die das Gleiche tut), etc. werden alle Größenordnungen mehr Differenz machen. – abarnert