Y a-t-il une classe de cordes en Python comme StringBuilder
en C# ?
Réponses
Trop de publicités?S'appuyer sur l'optimisation des compilateurs est fragile. Les repères liés dans la réponse acceptée et les chiffres donnés par Antoine-tran ne sont pas dignes de confiance. Andrew Hare commet l'erreur d'inclure un appel à repr
dans ses méthodes. Cela ralentit toutes les méthodes de manière égale, mais masque la pénalité réelle dans la construction de la chaîne.
Utilisez join
. C'est très rapide et plus robuste.
$ ipython3
Python 3.5.1 (default, Mar 2 2016, 03:38:02)
IPython 4.1.2 -- An enhanced Interactive Python.
In [1]: values = [str(num) for num in range(int(1e3))]
In [2]: %%timeit
...: ''.join(values)
...:
100000 loops, best of 3: 7.37 µs per loop
In [3]: %%timeit
...: result = ''
...: for value in values:
...: result += value
...:
10000 loops, best of 3: 82.8 µs per loop
In [4]: import io
In [5]: %%timeit
...: writer = io.StringIO()
...: for value in values:
...: writer.write(value)
...: writer.getvalue()
...:
10000 loops, best of 3: 81.8 µs per loop
En utilisant la méthode 5 ci-dessus (Le Pseudo Fichier), nous pouvons obtenir une très bonne performance et flexibilité
from cStringIO import StringIO
class StringBuilder:
_file_str = None
def __init__(self):
self._file_str = StringIO()
def Append(self, str):
self._file_str.write(str)
def __str__(self):
return self._file_str.getvalue()
l'utilise maintenant
sb = StringBuilder()
sb.Append("Hello\n")
sb.Append("World")
print sb