Gibt es einen Grund, nicht '+' zu verwenden, um zwei Strings zu verketten?
Einer gemeinsamen antipattern in Python ist die Verkettung einer Folge von strings mit +
in einer Schleife. Das ist schlecht, da der Python-interpreter hat, erstellen Sie einen neuen string-Objekt für jede iteration, und es endet, wobei quadratische Zeit. (Aktuelle Versionen von CPython kann anscheinend diese optimieren, in einigen Fällen, aber in anderen Implementierungen können nicht, so dass die Programmierer davon abgehalten werden, sich auf diese.) ''.join
ist der richtige Weg, dies zu tun.
Aber ich habe gehört, es sagte (wie hier zum Beispiel auf Stack Overflow) , sollten Sie nie, nie Verwendung +
für die string-Verkettung, sondern verwenden Sie immer ''.join
oder eine format-string. Ich verstehe nicht, warum dies der Fall ist, wenn man nur die Verkettung von zwei Zeichenfolgen. Wenn mein Verständnis richtig ist, sollte es nicht nehmen quadratischen Zeit, und ich denke a + b
ist sauberer und besser lesbar als die beiden ''.join((a, b))
oder '%s%s' % (a, b)
.
Ist es gute Praxis zu verwenden +
um zwei strings zu verketten? Oder ist es ein problem, ich bin mir nicht bewusst?
InformationsquelleAutor der Frage Taymon | 2012-04-06
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nichts falsch in der Verkettung zwei strings mit
+
. In der Tat, es ist einfacher zu Lesen als''.join([a, b])
.Sind Sie richtig wenn Sie, dass die Verkettung von mehr als 2 strings mit
+
ist ein O(n^2) Betrieb (im Vergleich zu O(n) fürjoin
) und somit ineffizient. Aber dies hat nicht zu tun mit einer Schleife. Aucha + b + c + ...
ist O(n^2), der Grund dafür ist, dass jede Verkettung erzeugt einen neuen string.CPython2.4 und oben versuchen zu mildern, aber es ist immer noch ratsam, zu verwenden
join
bei der Verkettung von mehr als 2 strings.InformationsquelleAutor der Antwort ggozad
Plus-operator ist völlig in Ordnung, Lösung zu verketten zwei Python-strings. Aber wenn Sie halten das hinzufügen von mehr als zwei Zeichenketten (n > 25) , möchten Sie vielleicht zu denken, etwas anderes.
''.join([a, b, c])
trick ist eine performance-Optimierung.InformationsquelleAutor der Antwort Mikko Ohtamaa
Beim arbeiten mit mehreren Personen, ist es manchmal schwierig, genau zu wissen, was passiert. Mit einem format-string anstelle von verketten kann, vermeiden, eine Besondere Lästigkeit, die passiert ist, eine ganze Tonne von mal zu uns:
Sagen, eine Funktion benötigt ein argument, und Sie es schreiben erwartet man eine Zeichenfolge:
So, diese Funktion kann benutzt werden ziemlich oft in dem gesamten code. Ihre Mitarbeiter können genau wissen, was es tut, aber nicht unbedingt vollkommen up-to-Geschwindigkeit auf die Interna, und kann nicht wissen, dass die Funktion erwartet einen string. Und so können Sie am Ende mit diesem:
Wäre es kein problem, wenn Sie nur ein format-string:
Das gleiche gilt für alle Arten von Objekten, definieren
__str__
die möglicherweise übergeben werden müssen:Also ja: Wenn Sie können, verwenden Sie eine format-string - tun es und nutzen, was Python zu bieten hat.
InformationsquelleAutor der Antwort Izkata
Der Annahme, dass sollte man nie, nie, verwenden Sie + für string-Verkettung, sondern immer ".- Verknüpfung kann sein, ein Mythos. Es ist wahr, dass mit
+
schafft unnötige temporäre Kopien unveränderliches string-Objekt, aber der andere nicht die oft zitierte Tatsache ist, dass der Aufrufjoin
in einer Schleife würde in der Regel fügen Sie den Aufwandfunction call
. Nehmen wir dein Beispiel.Erstellen Sie zwei Listen, eine aus dem verlinkten Frage ALSO und ein weiterer eine größere hergestellt
Können erstellen Sie zwei Funktionen, die
UseJoin
undUsePlus
an der jeweiligenjoin
und+
Funktionalität.Lets laufen timeit mit der ersten Liste
Haben Sie fast die gleiche Laufzeit.
Können Verwendung cProfile
Und es sieht aus, dass die Verwendung von Join-Ergebnisse in unnötige Funktionsaufrufe, die hinzufügen können, um den overhead.
Kommen nun auch wieder die Frage. Sollte man raten von der Verwendung von
+
überjoin
in allen Fällen?Glaube ich nicht, Dinge, die berücksichtigt werden sollten,
- Und off-Kurs in einer Entwicklung-pre-Reife-Optimierung ist böse.
InformationsquelleAutor der Antwort Abhijit
Ich habe eine quick-test:
zeitspiele:
Gibt es anscheinend eine Optimierung für die
a = a + b
Fall. Es nicht eine O(n^2) Zeit, wie man meinen könnte.Also zumindest in Bezug auf Leistung, mit
+
ist in Ordnung.InformationsquelleAutor der Antwort Michael Slade
Laut Python-docs, mit str.join() geben Ihnen die Leistung, Konsistenz über verschiedene Implementierungen von Python. Obwohl CPython optimiert den Weg der quadratischen Verhalten von s = s + t, andere Python-Implementierungen möglicherweise nicht.
Sequenz-Typen in Python docs (siehe Fußnote [6])
InformationsquelleAutor der Antwort Duke
".join([a, b]) ist die bessere Lösung als +.
Da der Code geschrieben werden sollte in einer Weise, die nicht in Nachteil zu anderen Implementierungen von Python (PyPy, Jython, IronPython, Cython, Psyco, und so)
form a += b oder a = a + b ist zerbrechlich, selbst in CPython und ist nicht in allen Implementierungen die nicht refcounting (reference counting ist eine Technik, bei der die Speicherung der Anzahl der Referenzen, Pointer oder handles auf eine Ressource, wie ein Objekt, block, Arbeitsspeicher, Festplattenplatz oder anderen Ressourcen)
https://www.python.org/dev/peps/pep-0008/#programming-recommendations
InformationsquelleAutor der Antwort muhammad ali