Leistungsvergleich: Einfügen vs. Erstellen von Python-Set-Operationen

8

In Python ist es schneller zu a) Erstellen Sie ein Set aus einer Liste von n Elementen b) Fügen Sie n Elemente in ein Set ein?

Ich habe diese Seite gefunden (http://wiki.python.org/moin/TimeComplexity), aber es gab nicht genug Informationen, um zu entscheiden, welches schneller war.

Es scheint, dass das Einfügen von Items einzeln im schlimmsten Fall O (n * n) Zeit (wenn es Dicts verwendet) und O (n * 1) im durchschnittlichen Fall dauert. Bietet das Initialisieren eines Sets mit einer Liste eine Leistungsverbesserung?

    
GeneralBecos 29.04.2011, 18:07
quelle

4 Antworten

16

In O() complexity - es ist definitiv das gleiche, weil beide Ansätze genau das gleiche tun - fügen Sie n items in eine Menge ein.

Der Unterschied kommt von der Implementierung: Ein klarer Vorteil der Initialisierung von einem iterablen ist, dass Sie viele Funktionsaufrufe auf Python-Ebene speichern - die Initialisierung von einem iterierbaren erfolgt vollständig auf der C-Ebene (**).

Tatsächlich zeigen einige Tests auf einer Liste von 5.000.000 zufälligen ganzen Zahlen, dass das Hinzufügen von eins nach dem anderen langsamer ist:

%Vor%

(**) Wenn Sie in den Code der Mengen ( Objects/setobject.c ) schauen, läuft die Artikeleinfügung schließlich auf einen Aufruf von set_add_key hinaus. Bei der Initialisierung von einem iterablen wird diese Funktion in einer engen C-Schleife aufgerufen:

%Vor%

Auf der anderen Seite ruft jeder Aufruf von set.add die Attributsuche auf, die in die C set_add -Funktion aufgelöst wird, die wiederum set_add_key aufruft. Da die Elementhinzufügung selbst relativ schnell ist (die Hashtabellenimplementierung von Python ist sehr effizient), werden diese zusätzlichen Aufrufe alle aufgebaut.

    
Eli Bendersky 29.04.2011, 18:18
quelle
2
%Vor%     
Dan D. 29.04.2011 18:21
quelle
0

Auf meinem Thinkpad:

%Vor%     
Steve Tjoa 29.04.2011 18:25
quelle
0

Hier sind die Ergebnisse der Ausführung des Vergleichs mit timeit . Scheint, Initialisierung der Menge mit Hilfe der Liste schneller zu sein, neugierig, warum es so ist:

%Vor%

Python-Version: 2.7

    
sateesh 29.04.2011 18:21
quelle

Tags und Links