Warum ein Set für Listenvergleiche verwenden?

7

Ich lese gerade eine andere Benutzerfrage, während ich nach einer Möglichkeit suche, die Unterschiede in zwei Listen zu berechnen.

Python, berechnen Sie die Listendifferenz

Meine Frage ist, warum sollte ich

tun %Vor%

anstatt zu tun

%Vor%

edit: gerade bemerkt, dass die zweite Diff-Funktion tatsächlich die Ähnlichkeiten zurückgibt. Es sollte jetzt korrekt sein.

    
Jake 09.05.2012, 17:15
quelle

5 Antworten

8

Nur aus einer algorithmischen Perspektive braucht es O(n) , um die Menge zu konstruieren, und O(n) , um das Listenverständnis zu machen (seit dem Testen, ob ein Element in einer Menge enthalten ist, ist O(1) ). Im zweiten Beispiel würde jedoch O(n^2) zum Durchlaufen beider Listen benötigt. Also, unabhängig von der Programmiersprache, ist der erste Ansatz überlegen.

Auch list comprehensions in python ist von Natur aus schneller als eine for-Schleife. Dies reduziert den konstanten Faktor noch mehr (und dies auch signifikant). Der Grund dafür kann in diesem Post zusammengefasst werden, den ich hier zitiere:

  

Die Tatsache, dass Listenkompressen nur enthalten sein können   Ausdrücke, nicht Aussagen, ist ein beträchtlicher Faktor, ebenso viel weniger   Arbeit ist hinter den Kulissen für jede Iteration erforderlich. Ein weiterer Faktor   ist, dass der zugrundeliegende Iterationsmechanismus für Listenkompressen ist   viel näher an einer C-Schleife als die Ausführung einer for-Schleife.

    
tskuzzy 09.05.2012, 17:20
quelle
5

Der Hauptunterschied zwischen den beiden Optionen ist, dass derjenige, der set verwendet, asymptotisch viel effizienter ist.

Unter ziemlich günstigen Bedingungen kann das Nachschlagen eines Gegenstands in einem Satz in O(1) time erfolgen; Das Nachschlagen eines Elements in einer Liste erfordert O(n) time.

Der zweite, weniger signifikante Unterschied besteht darin, dass eine Version ein Listenverständnis verwendet, während die andere eine for -Schleife verwendet. List-Comprehensions erzeugen tendenziell kompakteren Code. Sie neigen auch dazu, effizienter zu sein (obwohl, wenn Leistung ein Anliegen ist, der einzige Weg, um ein genaues Bild zu erhalten, ist, Benchmarks zu laufen).

    
NPE 09.05.2012 17:19
quelle
2

Die Verwendung des Sets ist normalerweise schneller, da es nur b einmal iterieren muss, während Ihr Beispiel b einmal für jedes Element in a iterieren muss.

    
Gabe 09.05.2012 17:19
quelle
2

Das Verständnis von Listen wird im Allgemeinen als effizienter angesehen als die Verwendung normaler Listenoperationen beim Erstellen einer Liste. Wenn Speicher ein Problem ist, können Sie stattdessen einen Generator verwenden.

Dies bietet ein paar Informationen zu den Leistungen von for -loops, map und %Code%. @benhoyt hat auch einen nützlichen Link zum Vergleichen von Schleifen und Listenverstehen bereitgestellt.

Bitte beachten Sie jedoch, dass es sich bei einer spezifischen Leistung lohnt, Ihre verschiedenen Optionen zu testen, um die beste Option für Ihre spezifischen Anforderungen auszuwählen.

    
Levon 09.05.2012 17:17
quelle
2

Ich habe einige Tests gemacht:

test_lists.py

%Vor%

test_set_list_comprehensions.py

%Vor%

test_set.py

%Vor%

Und genau das sagt Timeit:

%Vor%

So scheint es am besten zu sein:

test_set.py

%Vor%     
raulcumplido 10.05.2012 11:21
quelle

Tags und Links