Daten|teiler
Kopieren als Kulturtechnik

Wissenswertes über Python: String-Formatierung

29. April 2011 von Christian Imhorst

Bekannterweise sind Verkettungen von Strings in Python, mit dem Plus-Operator (+) sehr einfach zu machen. Man kann auch eine Zahl mit einem String verketten, wenn man die Zahl vorher explizit mit str() in einen String umwandelt:

>>> s = 'Ich bin ein String'
>>> i = 123
>>> type(s)
<type 'str'>
>>> type(i)
<type 'int'>
>>> str(i) + ' ' + s + '!'
'123 Ich bin ein String!'

So praktisch sie auch sind, man sollte solche Verkettungen von Zeichenketten mit dem +-Operator vermeiden, da sie zu Lasten der Performance gehen. In Python sind Strings unveränderliche (immutable) Objekte, daher werden außer dem Ergebnis-String temporär weitere Strings angelegt, die hinterher von der Laufzeitumgebung wieder entsorgt werden müssen (garbage collection). In meinem Beispiel wird inklusive Ergebnis-String dreimal ein neuer String konstruiert und die beiden temporär erstellten Vorgänger werden wieder freigegeben. Dabei muss jedes Mal der Inhalt des alten Strings in den neuen kopiert werden, was alles zusammen Performance frisst.

Die Erzeugung des Ergebnis-Strings sollte man daher an einen String-Formatierer übergeben:

>>> '%d %s!' % (i, s)
'123 Ich bin ein String!'

Dabei sind %d und %s Platzhalter für den Inhalt der Variablen i und s. Die Platzhalter sind aber nicht frei wählbar, so steht %d für Dezimalzahlen, %s für Strings, %x für Hexadezimalzahlen, %e, %f und %g für Gleitkommazahlen. Bei der String-Formatierung entfällt nicht nur das Kopieren der String-Inhalte in neue Strings und das anschließende Aufräumen, sondern auch die explizite Typumwandlung der Ganzzahl in i in einen String mit str(), was einfach performanter ist.

Geschrieben in Python

2 Antworten

  1. dmaus

    Soso. Bei der String-Formatierung “fallen” die Operationen “weg”, die der Interpreter bei der Ausführung einer anderen Funktion, der String-Verkettung ausführt. Deswegen ist String-Formatierung performanter.

    Da setzt du doch die berühmten Äpfel und Birnen in’s Verhältnis: Was ist denn mit dem Aufwand den der Interpreter für die String-Formatierung leisten muss? Den musst du doch mit dem der String-Verkettung vergleichen.

  2. Helmut

    @dmaus: an sich haben beide ähnlichen Rechenaufwand Jedoch findet die String-Formatierung nicht im Python-Interpreter statt sondern direkt im Maschinencode, weshalb eben doch ein Performancevorteil entsteht.