Großer Zeitunterschied zwischen dem Sortieren einer Menge und dem Sortieren einer Liste in Python

9

Ich habe mich gefragt, ob ich meine Datenstruktur als Set oder Liste haben soll. Meistens werde ich Operationen ausführen, aber am Ende muss ich es sortieren.

Ich habe mich gefragt, ob ich zuerst eine Liste erstellen soll, und dann sorted(list(my_set)) verwenden, oder einfach die Menge sofort sortieren sorted(my_set) . Ich könnte eine allgemeine "Listen" -Phase erwägen, da es zu diesem Zeitpunkt sinnvoll ist, eine geordnete iterable zu diesem Zeitpunkt zu haben.

Also habe ich beschlossen, es zu testen und erwarte, dass eine Liste schneller wird.

Benchmarker:

%Vor%

Daten:

%Vor%

Ich habe dann festgestellt, dass es vielleicht damit zu tun hat, dass die Elemente bereits vorhanden sind und dass diese erstaunliche Frage & amp; antwort .

Dann habe ich einige zufällige Daten ausprobiert:

%Vor%

Mit den Ergebnissen:

%Vor%

Riesiger Unterschied, was ist los?

Bonus: Es erscheint sogar zu einem Zeitpunkt von einer Minute, dass sorted(set(a_list)) ist beeindruckend schneller als sorted(a_list) .

Tatsächlich können im zweiten Fall Duplikate existieren, die gefiltert werden und so die Sortierung beschleunigen.

    
PascalVKooten 23.12.2014, 00:07
quelle

1 Antwort

3

Ich habe deinen Code ein wenig erweitert und hoffe, dass dir das einen Einblick gibt, was passiert:

%Vor%

dies druckt:

%Vor%

Dies liegt an der Kollision im Zufallszahlenbereich

%Vor%

gibt als Ausgabe:

%Vor%

Das b2 wäre schneller, weil es weniger Elemente gibt, ist logischer, aber das ist noch schneller, wenn Sie zuerst eine Liste des Satzes erstellen müssen. Dass es wieder langsamer ist, wenn man diese Liste mischt, ist wieder logisch und das gemischte Ergebnis ist ziemlich nah an dem Ergebnis für a2, wenn man die Länge der Listen kompensiert.

Versuchen wir also, etwas anderes in die Liste aufzunehmen:

%Vor%

gibt (ich wäre ziemlich überrascht gewesen, weniger als 1000 Elemente zu haben):

%Vor%

Es muss also etwas mit Zahlen im Set zu tun haben:

%Vor%

gibt Ihnen:

%Vor%

Anstatt zu iterieren, hat ein Set eine pop() -Funktion, die Sie verwenden können :

  

pop ()

     

Entfernen Sie ein beliebiges Element aus der Menge und geben Sie es zurück. Löst KeyError aus, wenn die Menge leer ist.

Also lasst beliebig Elemente aus der Menge b2 abfragen und sehen, ob es etwas Besonderes gibt:

%Vor%

ergibt das gleiche Ergebnis:

%Vor%

Das willkürliche Abrufen von Elementen der Zahlengruppe ruft diese Zahlen der Reihe nach ab, unabhängig von der Reihenfolge, in der diese Zahlen eingegeben wurden . Da die Iteration ein Element zum Zeitpunkt des Anhängens an die Liste abruft, ist das Ergebnis von list(b2) eine geordnete Liste, die mit Timsort Algorithmus in Python verwendet.

    
Anthon 08.06.2015 16:56
quelle

Tags und Links