Was ist der "eine [...] offensichtliche Weg" , um alle Elemente eines iterablen zu einem vorhandenen hinzuzufügen set
?
python
set
conventions
iterable
Ian Mackinnon
quelle
quelle
set
Konstruktor eine Iterierbarkeit als Argument verwendet.{1, 2, 3}
in Python 3 ist, während esset([1, 2, 3])
in Python 2 war.Zum Wohle eines jeden, der könnte glauben , zB das zu tun
aset.add()
in einer Schleife Leistung wettbewerbsfähig haben würde tunaset.update()
, hier ist ein Beispiel dafür , wie Sie Ihre Überzeugungen schnell , bevor sie der Öffentlichkeit testen:Es sieht so aus, als ob die Kosten pro Element des Schleifenansatzes mehr als das DREIfache der Kosten des Ansatzes betragen
update
.Die Verwendung
|= set()
kostet ungefähr das 1,5-facheupdate
der Leistung, aber die Hälfte der Kosten für das Hinzufügen jedes einzelnen Elements in einer Schleife.quelle
Mit der Funktion set () können Sie ein iterables Element in ein Set konvertieren und dann mit dem Standard-Set-Update-Operator (| =) die eindeutigen Werte aus Ihrem neuen Set in das vorhandene Set einfügen.
quelle
.update
hat den Vorteil, dass das Argument im Gegensatz zur rechten Seite des|=
Operators in Ihrem Beispiel beliebig iterierbar sein kann - nicht unbedingt eine Menge .|
für die Vereinigung,&
für die Kreuzung und^
für das Abrufen von Elementen, die sich in dem einen oder anderen befinden, aber nicht in beiden. Aber in einer dynamisch typisierten Sprache, in der es manchmal schwierig ist, den Code zu lesen und die Arten von herumfliegenden Objekten zu kennen, zögere ich, diese Operatoren zu verwenden. Jemand, der sie nicht erkennt (oder vielleicht gar nicht merkt, dass Python solche Operatoren zulässt), könnte verwirrt sein und denken, dass einige seltsame bitweise oder logische Operationen ablaufen. Es wäre schön, wenn diese Operatoren auch an anderen.update()
und fügen Sie einzelne Elemente in einer Schleife hinzu. Fand das.update()
war schneller. Ich habe meine Ergebnisse zu dieser vorhandenen Antwort hinzugefügt: stackoverflow.com/a/4046249/901641Nur ein kurzes Update, Timings mit Python 3:
Ergebnisse sind:
quelle
Verwenden Sie das Listenverständnis.
Kurzschließen der Erstellung von iterable anhand einer Liste zum Beispiel :)
[Bearbeiten: den festgelegten Teil der Frage verpasst]
quelle
Für die Aufzeichnung denke ich die Behauptung, dass "es einen - und vorzugsweise nur einen - offensichtlichen Weg geben sollte, dies zu tun." ist falsch. Es wird davon ausgegangen, dass viele technisch denkende Menschen davon ausgehen, dass jeder gleich denkt. Was für eine Person offensichtlich ist, ist für eine andere Person nicht so offensichtlich.
Ich würde argumentieren, dass meine vorgeschlagene Lösung klar lesbar ist und das tut, was Sie verlangen. Ich glaube nicht, dass es irgendwelche Performance-Hits gibt - obwohl ich zugeben muss, dass mir etwas fehlt. Trotz alledem ist dies möglicherweise nicht offensichtlich und einem anderen Entwickler vorzuziehen.
quelle
aset.update(iterable)
mit C-Geschwindigkeitfor item in iterable: aset.add(item)
wiederholt wird, während Schleifen mit Python-Geschwindigkeit ausgeführt werden, mit einer Methodensuche und einem Methodenaufruf (aarrgghh !!) pro Element.