Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > de.comp.lang.python > #4860 > unrolled thread
| Started by | Hermann Riemann <nospam.ng@hermann-riemann.de> |
|---|---|
| First post | 2017-08-25 07:45 +0200 |
| Last post | 2017-09-16 17:30 +0200 |
| Articles | 9 on this page of 49 — 14 participants |
Back to article view | Back to de.comp.lang.python
strings zusammensetzen. Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-08-25 07:45 +0200
Re: [Python-de] strings zusammensetzen. Mike Müller <mmueller@python-academy.de> - 2017-08-25 08:00 +0200
Re: [Python-de] strings zusammensetzen. Stefan Behnel <python-de@behnel.de> - 2017-08-25 08:05 +0200
Re: [Python-de] strings zusammensetzen. Stefan Schwarzer <sschwarzer@sschwarzer.net> - 2017-08-25 09:08 +0200
Re: [Python-de] strings zusammensetzen. "Tobias Herp" <tobias.herp@gmx.de> - 2017-08-25 10:28 +0200
Re: [Python-de] strings zusammensetzen. ole-usenet-spam@gmx.net (Оlе Ѕtrеісhеr) - 2017-08-25 10:47 +0200
Re: [Python-de] strings zusammensetzen. Tobias Herp <tobias.herp@gmx.de> - 2017-08-25 23:28 +0200
Re: [Python-de] strings zusammensetzen. ole-usenet-spam@gmx.net (Оlе Ѕtrеісhеr) - 2017-08-26 10:30 +0200
Re: [Python-de] strings zusammensetzen. Peter Otten <__peter__@web.de> - 2017-08-26 13:29 +0200
Re: [Python-de] strings zusammensetzen. "Walter Dörwald" <walter@livinglogic.de> - 2017-08-29 17:21 +0200
Re: [Python-de] strings zusammensetzen. Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-08-30 07:26 +0200
Re: [Python-de] strings zusammensetzen. Stefan Behnel <python-de@behnel.de> - 2017-08-30 07:48 +0200
Re: [Python-de] strings zusammensetzen. Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-08-30 08:04 +0200
Re: [Python-de] strings zusammensetzen. ole-usenet-spam@gmx.net (Оlе Ѕtrеісhеr) - 2017-08-30 08:23 +0200
Re: [Python-de] strings zusammensetzen. Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-08-30 09:37 +0200
Re: [Python-de] strings zusammensetzen. Peter Otten <__peter__@web.de> - 2017-08-30 10:23 +0200
Re: [Python-de] strings zusammensetzen. Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-08-30 20:00 +0200
Re: [Python-de] strings zusammensetzen. "Peter Heitzer" <peter.heitzer@rz.uni-regensburg.de> - 2017-08-30 08:30 +0000
Re: [Python-de] strings zusammensetzen. Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-08-30 20:03 +0200
Re: [Python-de] strings zusammensetzen. Thomas Orgelmacher <trash@odbs.org> - 2017-08-30 20:21 +0200
Re: [Python-de] strings zusammensetzen. Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-08-31 14:31 +0200
Re: [Python-de] strings zusammensetzen. Thomas Orgelmacher <trash@odbs.org> - 2017-08-31 19:26 +0200
Re: [Python-de] strings zusammensetzen. Peter Otten <__peter__@web.de> - 2017-08-30 21:24 +0200
Re: [Python-de] strings zusammensetzen. Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-08-31 14:40 +0200
Re: [Python-de] strings zusammensetzen. Peter Otten <__peter__@web.de> - 2017-08-31 15:26 +0200
Re: [Python-de] strings zusammensetzen. "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2017-09-16 09:45 +0200
Re: [Python-de] strings zusammensetzen. Thomas Orgelmacher <trash@odbs.org> - 2017-08-31 19:11 +0200
Re: [Python-de] strings zusammensetzen. Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-09-01 09:12 +0200
Re: [Python-de] strings zusammensetzen. Thomas Orgelmacher <trash@odbs.org> - 2017-09-01 21:06 +0200
Re: [Python-de] strings zusammensetzen. Stefan Behnel <python-de@behnel.de> - 2017-09-01 21:43 +0200
Re: [Python-de] strings zusammensetzen. Arnold Krille <arnold@arnoldarts.de> - 2017-09-02 15:23 +0200
Re: [Python-de] strings zusammensetzen. "Walter Dörwald" <walter@livinglogic.de> - 2017-08-30 11:53 +0200
Re: [Python-de] strings zusammensetzen. Mike Müller <mmueller@python-academy.de> - 2017-08-30 16:14 +0200
Re: [Python-de] strings zusammensetzen. Mike Müller <mmueller@python-academy.de> - 2017-08-25 11:18 +0200
Re: [Python-de] strings zusammensetzen. Stefan Schwarzer <sschwarzer@sschwarzer.net> - 2017-08-25 12:40 +0200
Re: [Python-de] strings zusammensetzen. Tobias Herp <tobias.herp@gmx.de> - 2017-08-25 23:41 +0200
Re: [Python-de] strings zusammensetzen. "Dr. Volker Jaenisch" <volker.jaenisch@inqbus.de> - 2017-08-26 02:34 +0200
Re: strings zusammensetzen. Thomas Orgelmacher <trash@odbs.org> - 2017-08-29 19:05 +0200
Re: strings zusammensetzen. ole-usenet-spam@gmx.net (Оlе Ѕtrеісhеr) - 2017-08-30 08:32 +0200
Re: strings zusammensetzen. "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2017-09-16 09:28 +0200
Re: [Python-de] strings zusammensetzen. Stefan Behnel <python-de@behnel.de> - 2017-09-16 10:33 +0200
Re: [Python-de] strings zusammensetzen. "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2017-09-16 22:46 +0200
Re: [Python-de] strings zusammensetzen. Stefan Behnel <python-de@behnel.de> - 2017-09-17 08:19 +0200
Re: [Python-de] strings zusammensetzen. "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2017-09-17 12:34 +0200
Re: [Python-de] strings zusammensetzen. ole-usenet-spam@gmx.net (Оlе Ѕtrеісhеr) - 2017-09-17 10:50 +0200
Re: [Python-de] strings zusammensetzen. Stefan Behnel <python-de@behnel.de> - 2017-09-17 11:14 +0200
Re: [Python-de] strings zusammensetzen. "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2017-09-17 14:19 +0200
Re: strings zusammensetzen. Hermann Riemann <nospam.ng@hermann-riemann.de> - 2017-09-16 16:19 +0200
Re: [Python-de] strings zusammensetzen. Stefan Behnel <python-de@behnel.de> - 2017-09-16 17:30 +0200
Page 3 of 3 — ← Prev page 1 2 [3]
| From | Stefan Behnel <python-de@behnel.de> |
|---|---|
| Date | 2017-09-16 10:33 +0200 |
| Subject | Re: [Python-de] strings zusammensetzen. |
| Message-ID | <mailman.263.1505550817.15585.python-de@python.org> |
| In reply to | #4907 |
Peter J. Holzer schrieb am 16.09.2017 um 09:28: > (String-Konkatenation ist in Python(3) zumindest bei langen Strings auch > schön linear) Es gibt sowohl für bytes-Objekte als auch für Unicode-Strings eine Sonderbehandlung, die realloc() verwendet. Auf vielen Platformen ist realloc() effizient und führt im Durchschnitt zu einer linearen Laufzeit auch bei mehreren Konkatenierungen. Aber nicht auf allen. Außerdem greift die Optimierung nicht in allen Fällen. Beispielsweise hast du Pech, wenn über die Konkatenierungen hinweg der Zeichenraum erst von ASCII auf BMP und dann auf Astral wechselt. Dann muss beim Wechsel der komplette bisherige String doch wieder im Speicher herum kopiert werden. Ein join() kann das vermeiden, weil gleich am Anfang alle Strings bekannt sind, und damit auch der finale Zeichenraum. Hier hast du also die Garantie, dass das Zusammenfügen effizient erfolgt. Also kurz: join() ist in jedem Fall die bessere Variante bei vielen Strings. Konkatenierung ist ok bei einer überschaubaren Menge und da insbesondere bei kurzen Strings, sollte aber in Schleifen vermieden werden. Stefan
[toc] | [prev] | [next] | [standalone]
| From | "Peter J. Holzer" <hjp-usenet3@hjp.at> |
|---|---|
| Date | 2017-09-16 22:46 +0200 |
| Subject | Re: [Python-de] strings zusammensetzen. |
| Message-ID | <slrnorr3db.686.hjp-usenet3@hrunkner.hjp.at> |
| In reply to | #4909 |
On 2017-09-16 08:33, Stefan Behnel <python-de@behnel.de> wrote:
> Peter J. Holzer schrieb am 16.09.2017 um 09:28:
>> (String-Konkatenation ist in Python(3) zumindest bei langen Strings auch
>> schön linear)
>
> Es gibt sowohl für bytes-Objekte als auch für Unicode-Strings eine
> Sonderbehandlung, die realloc() verwendet. Auf vielen Platformen ist
> realloc() effizient und führt im Durchschnitt zu einer linearen Laufzeit
> auch bei mehreren Konkatenierungen. Aber nicht auf allen.
Ineffiziente Plattformen sollte man meiden :-). Allerdings ist das eher
eine Frage, wie Python damit umgeht als wie gut die Malloc-
Implementation ist - obwohl eine gute Malloc-Implementation gewisse
Schwächen im Interpreter gut übertünchen kann (wie eine Diskussion zum
gleichen Thema in Perl vor ein paar Jahren gezeigt hat).
> Außerdem greift die Optimierung nicht in allen Fällen. Beispielsweise hast
> du Pech, wenn über die Konkatenierungen hinweg der Zeichenraum erst von
> ASCII auf BMP und dann auf Astral wechselt. Dann muss beim Wechsel der
> komplette bisherige String doch wieder im Speicher herum kopiert werden.
Das dürfte weitgehend vernachlässigbar sein, weil es maximal 2 solche
Übergänge geben kann. Also viel weniger als die Kopiervorgänge, die
üblicherweise tatsächlich stattfinden, weil realloc nicht in-place
expandieren kann.
> Also kurz: join() ist in jedem Fall die bessere Variante bei vielen
> Strings. Konkatenierung ist ok bei einer überschaubaren Menge und da
> insbesondere bei kurzen Strings, sollte aber in Schleifen vermieden werden.
Du vergisst, dass Listen einen nicht zu vernachlässigbaren
Memory-Overhead haben. Gerade bei langen Listen sollte man darauf
verzichten, sie aufzubauen, wenn man sie nicht unbedingt braucht (habe
damit erst kürzlich 8 GB eingespart - pro Prozess (das war Perl und
nicht Python, aber die beiden Sprachen sind sich da sehr ähnlich)).
Kleiner Test:
------------------------------------------------------------------------
#!/usr/bin/python3
import sys
import time
n = int(sys.argv[1])
t0 = time.clock_gettime(time.CLOCK_MONOTONIC)
s = ""
for i in range(n):
s += str(i)
t1 = time.clock_gettime(time.CLOCK_MONOTONIC)
print(n, t1-t0, n / (t1 - t0))
------------------------------------------------------------------------
------------------------------------------------------------------------
#!/usr/bin/python3
import sys
import time
n = int(sys.argv[1])
tick_size = 1000000
t0 = time.clock_gettime(time.CLOCK_MONOTONIC)
elems = []
for i in range(n):
elems.append(str(i))
s = "".join(elems)
t1 = time.clock_gettime(time.CLOCK_MONOTONIC)
print(n, t1 - t0, n / (t1 - t0))
------------------------------------------------------------------------
Ergebnis: Performance ist praktisch gleich, aber auf einer
32-Bit-Maschine kommt die Konkatenierungsversion gut 3 mal so weit,
bevor sie am Memory-Limit anstößt.
(Graphik auf <http://www.hjp.at/programming/python/concat-vs-join/>)
hp
--
_ | Peter J. Holzer | Fluch der elektronischen Textverarbeitung:
|_|_) | | Man feilt solange an seinen Text um, bis
| | | hjp@hjp.at | die Satzbestandteile des Satzes nicht mehr
__/ | http://www.hjp.at/ | zusammenpaßt. -- Ralph Babel
[toc] | [prev] | [next] | [standalone]
| From | Stefan Behnel <python-de@behnel.de> |
|---|---|
| Date | 2017-09-17 08:19 +0200 |
| Subject | Re: [Python-de] strings zusammensetzen. |
| Message-ID | <mailman.278.1505629198.15585.python-de@python.org> |
| In reply to | #4912 |
Peter J. Holzer schrieb am 16.09.2017 um 22:46: > Gerade bei langen Listen sollte man darauf > verzichten, sie aufzubauen, wenn man sie nicht unbedingt braucht Natürlich. Einzig darauf zielt dein Beispielcode ja auch ab. Gilt übrigens genauso für lange Strings. > (habe > damit erst kürzlich 8 GB eingespart - pro Prozess (das war Perl und > nicht Python, aber die beiden Sprachen sind sich da sehr ähnlich)). Wie du hier korrekt andeutest, handelt es sich bei dem gegebenen Fall um eine Optimierung. Optimierung bedeutet ja, dass du eigentlich gut geschriebenen Code ersetzt durch etwas, was dem spezifischen Anwendungsfall stärker angepasst ist und (nachweislich) unter den erwarteten Bedingungen effizienter funktioniert. Mit dem Risiko, dass es unter anderen (eben nicht erwarteten) Bedingungen vielleicht auch weniger gut funktioniert. Kann manchmal zu Y2K-Problemen führen, aber ansonsten ist dagegen nichts einzuwenden. Stefan
[toc] | [prev] | [next] | [standalone]
| From | "Peter J. Holzer" <hjp-usenet3@hjp.at> |
|---|---|
| Date | 2017-09-17 12:34 +0200 |
| Subject | Re: [Python-de] strings zusammensetzen. |
| Message-ID | <slrnorsju5.igr.hjp-usenet3@hrunkner.hjp.at> |
| In reply to | #4913 |
On 2017-09-17 06:19, Stefan Behnel <python-de@behnel.de> wrote:
> Peter J. Holzer schrieb am 16.09.2017 um 22:46:
>> Gerade bei langen Listen sollte man darauf verzichten, sie
>> aufzubauen, wenn man sie nicht unbedingt braucht
>
> Natürlich. Einzig darauf zielt dein Beispielcode ja auch ab.
>
> Gilt übrigens genauso für lange Strings.
Natürlich. Wenn man den langen String nie braucht, soll man ihn auch
nicht aufbauen. Gerade, wenn der String an einen Konsumenten geschickt
werden soll, der ihn dann gleich wieder parst, hat man auch noch den
Vorteil, dass Produzent und Konsument sich zeitlich überlappen können,
wenn der Produzent Teile des Outputs so früh wie möglich schickt. Geht
aber leider nicht immer: Manche Protokolle brauchen z.B. eine
Längenangabe im Header und dafür muss man den Output erst mal komplett
haben, um die Länge bestimmen zu können.
>> (habe damit erst kürzlich 8 GB eingespart - pro Prozess (das war Perl
>> und nicht Python, aber die beiden Sprachen sind sich da sehr
>> ähnlich)).
>
> Wie du hier korrekt andeutest, handelt es sich bei dem gegebenen Fall um
> eine Optimierung. Optimierung bedeutet ja, dass du eigentlich gut
> geschriebenen Code ersetzt durch etwas, was dem spezifischen Anwendungsfall
> stärker angepasst ist und (nachweislich) unter den erwarteten Bedingungen
> effizienter funktioniert. Mit dem Risiko, dass es unter anderen (eben nicht
> erwarteten) Bedingungen vielleicht auch weniger gut funktioniert.
Richtig. Wobei in diesem Fall allerdings beide Varianten von der
Code-Länge und Lesbarkeit her ziemlich vergleichbar waren. Im Gegensatz
zu manchen anderen Fällen, wo es klar eine "saubere" und eine optimierte
Variante gibt, gab es hier zwei Varianten, die zwar verschiedenen
Ansätzen (eher prozedural und eher funktional) folgten, aber (für meinen
Geschmack) beide gleich sauber waren. Da dann die Variante zu wählen,
die weniger Speicher braucht und schneller ist, ist ein No-Brainer (und
ja, ich habe beide Varianten gebenchmarkt, bevor ich die Änderung
durchgeführt habe).
Bei dem kleinen Test-Programm sehe ich das ähnlich: Die Variante mit
join ist *nicht* klar sauberer. Eher im Gegenteil: Sie baut explizit
eine unnötige Datenstruktur auf, das empfinde ich als unelegant. (Etwas
anderes ist es, wenn die Datenstruktur nur implizit aufgebaut wird: Mit
map statt der explizitien Schleife (was bei diesem Trivialbeispiel
natürlich leicht möglich gewesen wäre) wäre der Code für mich eindeutig
eleganter und damit wäre eine möglich Optimierung nur sinnvoll, wenn die
positiven Effekte zur Laufzeit die negativen Effekte für den
Programmierer überwiegen.)
Aber im wesentlichen ging es mir eben um Deine dogmatisch vorgetragene
Aussage:
| join() ist in jedem Fall die bessere Variante bei vielen Strings.
Das sehe ich eben nicht so. Gerade bei vielen Strings gibt es Fälle, wo
es besser ist, den String stückweise in einer Schleife aufzubauen.
| Konkatenierung ist ok bei einer überschaubaren Menge und da
| insbesondere bei kurzen Strings, sollte aber in Schleifen vermieden
| werden.
Und wie nun ausführlich begründet, sehe ich das genau umgekehrt: Bei
kurzen Strings, die aus wenigek Komponenten zusammengesetzt werden, ist
beides Ok. Bei langen Strings, die aus vielen Komponenten aufgebaut
werden, sollte man sich überlegen, ob nicht eine explizite Schleife
besser ist als ein Join.
hp
--
_ | Peter J. Holzer | Fluch der elektronischen Textverarbeitung:
|_|_) | | Man feilt solange an seinen Text um, bis
| | | hjp@hjp.at | die Satzbestandteile des Satzes nicht mehr
__/ | http://www.hjp.at/ | zusammenpaßt. -- Ralph Babel
[toc] | [prev] | [next] | [standalone]
| From | ole-usenet-spam@gmx.net (Оlе Ѕtrеісhеr) |
|---|---|
| Date | 2017-09-17 10:50 +0200 |
| Subject | Re: [Python-de] strings zusammensetzen. |
| Message-ID | <87shflpv3g.fsf@gmx.net> |
| In reply to | #4912 |
"Peter J. Holzer" <hjp-usenet3@hjp.at> writes: > elems = [] > for i in range(n): > elems.append(str(i)) > s = "".join(elems) Wenn Du hier schon auf Optimierung achtest: wozu dann erst lie Liste? Join nimmt jedes Iterable: s = "".join(map(str, range(x))) Ist kürzer, prägnanter, performanter und deutlich effektiver im Speicher. Letztlich ist es (wie immer) stark von der Aufgabenstellung abhängig: häufig hat man (wenn man denn einen großen String bauen will) gar keine Strings als Ausgangsbasis, sondern etwas anderes. Und da macht es keinen Sinn, temporär Listen von Strings zu erzeugen, sondern man sollte lieber mit Iterables arbeiten, die man mappt. Ole
[toc] | [prev] | [next] | [standalone]
| From | Stefan Behnel <python-de@behnel.de> |
|---|---|
| Date | 2017-09-17 11:14 +0200 |
| Subject | Re: [Python-de] strings zusammensetzen. |
| Message-ID | <mailman.280.1505640793.15585.python-de@python.org> |
| In reply to | #4914 |
Оlе Ѕtrеісhеr schrieb am 17.09.2017 um 10:50: > "Peter J. Holzer" writes: >> elems = [] >> for i in range(n): >> elems.append(str(i)) >> s = "".join(elems) > > Wenn Du hier schon auf Optimierung achtest: wozu dann erst lie Liste? > Join nimmt jedes Iterable: > > s = "".join(map(str, range(x))) > > Ist kürzer, prägnanter, performanter und deutlich effektiver im > Speicher. Bezüglich "effektiver im Speicher" möchte ich anregen, den Code zu lesen. Intern erzeugt "".join(genexpr) zuerst eine Liste. Das passiert immer, wenn keine Sequenz übergeben wird. Schließlich muss zweimal über diese drüber gelaufen werden können, was bei Iteratoren nicht gegeben ist. Ein Eckchen schneller wird map() hier wohl trotzdem sein, aber wir sollten nicht vergessen, dass so etwas wie das Beispiel oben in der Praxis nur *sehr* selten auftreten dürfte. Stefan
[toc] | [prev] | [next] | [standalone]
| From | "Peter J. Holzer" <hjp-usenet3@hjp.at> |
|---|---|
| Date | 2017-09-17 14:19 +0200 |
| Subject | Re: [Python-de] strings zusammensetzen. |
| Message-ID | <slrnorsq1l.7f1.hjp-usenet3@hrunkner.hjp.at> |
| In reply to | #4914 |
On 2017-09-17 08:50, Оlе Ѕtrеісhеr <ole-usenet-spam@gmx.net> wrote:
> "Peter J. Holzer" <hjp-usenet3@hjp.at> writes:
>> elems = []
>> for i in range(n):
>> elems.append(str(i))
>> s = "".join(elems)
>
> Wenn Du hier schon auf Optimierung achtest: wozu dann erst lie Liste?
Weil das einer der beiden Fälle war, die ich miteinander vergleichen
wollte. Und natürlich ist das ein Test-Beispiel und nichts, was so in
Produktivcode irgendwo vorkommt.
> Join nimmt jedes Iterable:
>
> s = "".join(map(str, range(x)))
>
> Ist kürzer, prägnanter,
Ja, definitiv. Aber es ist eine Änderung, die für den Vergleich
irrelevant ist und daher den Leser vom Kern des Arguments ablenken
würde. Daher habe ich das unterlassen.
> performanter
Bei diesem trivialen Test-Beispiel: Ja. Wenn die Schleife etwas mehr
macht als nur "str" aufzurufen, dürfte der Performance-Unterschied
zwischen map und einer expliziten Schleife eher vernachlässigbar sein.
> und deutlich effektiver im Speicher.
Nein. Ob die Liste implizit von join aufgebaut wird oder explizit vom
Programmcode, macht keinen Unterschied.
hp
--
_ | Peter J. Holzer | Fluch der elektronischen Textverarbeitung:
|_|_) | | Man feilt solange an seinen Text um, bis
| | | hjp@hjp.at | die Satzbestandteile des Satzes nicht mehr
__/ | http://www.hjp.at/ | zusammenpaßt. -- Ralph Babel
[toc] | [prev] | [next] | [standalone]
| From | Hermann Riemann <nospam.ng@hermann-riemann.de> |
|---|---|
| Date | 2017-09-16 16:19 +0200 |
| Message-ID | <f24q6oF7cucU1@mid.individual.net> |
| In reply to | #4907 |
Am 16.09.2017 um 09:28 schrieb Peter J. Holzer:
> Wenn Du die bereits in einer Liste vorliegen hast, ist "".join(liste)
> natürlich ideal.
> Aber wenn Du die Liste erst bauen musst, ist
> liste = []
> for ...:
> element = ...
> liste.append(element)
> s = "".join(liste)
> sicher nicht besser als
> s = ""
> for ...:
> element = ...
> s += element
Wenn bei einer Liste ein Element angehängt wird werden vermutlich
nur eine 4 oder 8 byte lange Adresse in ein Feld angehängt.
Bei jedem Buchstabe je nach utf-darstellung 2 oder 4 byte.
( Bei diakritischen Zeichen entsprechend mehr)
Wenn bei Speicherplatz eines Feldes nicht bei jeden neuen
Element ein neues Feld angelegt wird,
sondern bei Erweiterungen hinten vielleicht 20% Platz
für Erweiterungen reserviert werden,
dürfte es einiges schneller gehen.
> (String-Konkatenation ist in Python(3)
> zumindest bei langen Strings auch schön linear)
In Python2 war jeder Buchstabe 1 byte;
utf- Sonderzeichen wie ö Zeichen waren halt mehrere Buchstaben.
( Diakritische Zeichen sind auch in Python3 "mehr als ein Buchstabe"
was z.B. bei Indizierung, Zerlegung etc.
unerwartete Effekte haben kann.)
Hermann
der nicht sagen kann, ob für strings mit gleichem Inhalt
jedes mal neuer Speicherplatz angelegt wird,
oder eine hash Suche losläuft.
--
http://www.hermann-riemann.de
[toc] | [prev] | [next] | [standalone]
| From | Stefan Behnel <python-de@behnel.de> |
|---|---|
| Date | 2017-09-16 17:30 +0200 |
| Subject | Re: [Python-de] strings zusammensetzen. |
| Message-ID | <mailman.265.1505576228.15585.python-de@python.org> |
| In reply to | #4910 |
Hermann Riemann schrieb am 16.09.2017 um 16:19: > Wenn bei einer Liste ein Element angehängt wird werden vermutlich > nur eine 4 oder 8 byte lange Adresse in ein Feld angehängt. > Bei jedem Buchstabe je nach utf-darstellung 2 oder 4 byte. > ( Bei diakritischen Zeichen entsprechend mehr) In Py2 gab es die 2-byte Unicode-Option, die wirklich UTF-16 verwendet hat (war vor allem unter Windows verbreitet), aber in Py3 ist die interne Darstellung nicht UTF-kodiert, sondern es wird zwischen ASCII, ISO8859-1, BMP und Astral unterschieden. In einzelnen Sonderfällen gibt es auch da noch eine UTF-16 Darstellung, aber die wird praktisch (außerhalb der Windows-Welt) nicht mehr verwendet. Kannst sie als Implementierungsdetail ansehen. > Wenn bei Speicherplatz eines Feldes nicht bei jeden neuen > Element ein neues Feld angelegt wird, > sondern bei Erweiterungen hinten vielleicht 20% Platz > für Erweiterungen reserviert werden, > dürfte es einiges schneller gehen. Ist bei Listen so, genau aus dem Grund. Wenn einmal was angehängt wird, war mit mit sehr hoher Wahrscheinlichkeit nicht das letzte Mal. > In Python2 war jeder Buchstabe 1 byte; Blödsinn. > utf- Sonderzeichen wie ö Zeichen waren halt mehrere Buchstaben. Blödsinn. > ( Diakritische Zeichen sind auch in Python3 "mehr als ein Buchstabe" > was z.B. bei Indizierung, Zerlegung etc. > unerwartete Effekte haben kann.) Richtig. Da hilft in den meisten Fällen eine Zeichennormalisierung. Oft genug ist es aber auch einfach egal, weil Text überraschend oft gar nicht zeichenweise verarbeitet wird. > Hermann > der nicht sagen kann, ob für strings mit gleichem Inhalt > jedes mal neuer Speicherplatz angelegt wird, > oder eine hash Suche losläuft. Code lesen hilft. Stefan
[toc] | [prev] | [standalone]
Page 3 of 3 — ← Prev page 1 2 [3]
Back to top | Article view | de.comp.lang.python
csiph-web