it-swarm.com.de

Python Sets vs Listen

Welche Datenstruktur ist in Python effizienter/schneller? Angenommen, diese Reihenfolge ist für mich nicht wichtig und ich würde sowieso nach Duplikaten suchen. Ist ein Python-Set langsamer als eine Python-Liste?

147
Mantas Vidutis

Es hängt davon ab, was Sie damit vorhaben.

Sets sind wesentlich schneller, wenn sie feststellen möchten, ob ein Objekt im Set vorhanden ist (wie in x in s), aber langsamer als Listen, wenn es darum geht, ihren Inhalt zu durchlaufen.

Sie können das Modul timeit verwenden, um zu sehen, welche für Ihre Situation schneller ist.

182

Listen sind etwas schneller als Sätze, wenn Sie die Werte einfach durchlaufen möchten.

Sets sind jedoch erheblich schneller als Listen, wenn Sie prüfen möchten, ob ein Element darin enthalten ist. Sie können jedoch nur Unikate enthalten.

Es stellt sich heraus, dass Tupel mit Ausnahme ihrer Unveränderlichkeit fast genauso funktionieren wie Listen.

Iteration

>>> def iter_test(iterable):
...     for i in iterable:
...         pass
...
>>> from timeit import timeit
>>> timeit(
...     "iter_test(iterable)",
...     setup="from __main__ import iter_test; iterable = set(range(10000))",
...     number=100000)
12.666952133178711
>>> timeit(
...     "iter_test(iterable)",
...     setup="from __main__ import iter_test; iterable = list(range(10000))",
...     number=100000)
9.917098999023438
>>> timeit(
...     "iter_test(iterable)",
...     setup="from __main__ import iter_test; iterable = Tuple(range(10000))",
...     number=100000)
9.865639209747314

Bestimmen Sie, ob ein Objekt vorhanden ist

>>> def in_test(iterable):
...     for i in range(1000):
...         if i in iterable:
...             pass
...
>>> from timeit import timeit
>>> timeit(
...     "in_test(iterable)",
...     setup="from __main__ import in_test; iterable = set(range(1000))",
...     number=10000)
0.5591847896575928
>>> timeit(
...     "in_test(iterable)",
...     setup="from __main__ import in_test; iterable = list(range(1000))",
...     number=10000)
50.18339991569519
>>> timeit(
...     "in_test(iterable)",
...     setup="from __main__ import in_test; iterable = Tuple(range(1000))",
...     number=10000)
51.597304821014404
124
Ellis Percival

Listenleistung:

>>> import timeit
>>> timeit.timeit(stmt='10**6 in a', setup='a = range(10**6)', number=100000)
0.008128150348026608

Leistung einstellen:

>>> timeit.timeit(stmt='10**6 in a', setup='a = set(range(10**6))', number=100000)
0.005674857488571661

Vielleicht möchten Sie darüber nachdenken Tuples Sie ähneln Listen, können aber nicht geändert werden. Sie benötigen etwas weniger Speicher und sind schneller zugänglich. Sie sind nicht so flexibel, aber effizienter als Listen. Normalerweise dienen sie als Wörterbuchschlüssel.

Sets sind ebenfalls Sequenzstrukturen, jedoch mit zwei Unterschieden zu Listen und Tupeln. Obwohl Sets eine Reihenfolge haben, ist diese Reihenfolge willkürlich und unterliegt nicht der Kontrolle des Programmierers. Der zweite Unterschied besteht darin, dass die Elemente in einer Menge eindeutig sein müssen.

set per Definition. [ Python | wiki ]. 

>>> x = set([1, 1, 2, 2, 3, 3])
>>> x
{1, 2, 3}
7
user2601995

Set gewinnt aufgrund von "instant" -Kontrollen: https://en.wikipedia.org/wiki/Hash_table

List -Implementierung: In der Regel ein Array mit niedrigem Pegel nahe am Metall, geeignet für Iteration und Direktzugriff nach Elementindex.

Set Implementierung: https://en.wikipedia.org/wiki/Hash_table , iteriert nicht in einer Liste, sondern findet das Element durch Berechnen eines Hash aus dem Schlüssel, so Dies hängt von der Art der Schlüsselelemente und der Hash-Funktion ab. Ähnlich wie für Diktate. Ich vermute, list könnte schneller sein, wenn Sie sehr wenige Elemente (<5) haben. Je größer die Elementanzahl ist, desto besser wird set für eine Inhaltsüberprüfung. Es ist auch schnell für das Hinzufügen und Entfernen von Elementen.

NOTE: Wenn die list bereits sortiert ist, kann das Durchsuchen der list ziemlich schnell sein, aber in der Regel ist eine set schneller und für Checks einfacher.

4

Ich würde eine Set-Implementierung empfehlen, bei der der Anwendungsfall auf die Referenzierung oder Suche nach Existenz beschränkt ist, und die Tuple-Implementierung, bei der der Anwendungsfall eine Iteration erfordert. Eine Liste ist eine Low-Level-Implementierung und erfordert erheblichen Speicheraufwand. 

0

tl; dr

Datenstrukturen (DS) sind wichtig, weil sie verwendet werden, um Operationen an Daten durchzuführen, die im Wesentlichen Folgendes implizieren: Nehmen Sie eine Eingabe , Verarbeiten Sie sie , und geben die Ausgabe zurück.

Einige Datenstrukturen sind in bestimmten Fällen nützlicher als andere. Daher ist es ziemlich unfair zu fragen, welche (DS) effizienter/schneller ist. Es ist wie zu fragen, welches Werkzeug zwischen Messer und Gabel effizienter ist. Ich meine, alles hängt von der Situation ab.

Listen

Eine Liste ist eine veränderbare Sequenz , , die normalerweise zum Speichern von Sammlungen homogener Elemente verwendet wird . .

Sätze

Ein Set-Objekt ist eine ungeordnete Sammlung unterschiedlicher Hash-Objekte . Es wird häufig verwendet, um die Zugehörigkeit zu testen, Duplikate aus einer Sequenz zu entfernen und mathematische Operationen wie Schnittmenge, Vereinigung, Differenz und symmetrische Differenz zu berechnen.

Verwendungszweck

Aus einigen Antworten geht hervor, dass eine Liste beim Durchlaufen der Werte schneller ist als eine Menge. Andererseits ist ein Satz schneller als eine Liste, wenn geprüft wird, ob ein Element darin enthalten ist. Daher können Sie nur sagen, dass eine Liste für bestimmte Operationen besser ist als eine Menge und umgekehrt.

0
lmiguelvargasf