175 votes

Classe de chaîne de Python comme StringBuilder en C# ?

Y a-t-il une classe de cordes en Python comme StringBuilder en C# ?

49voto

GrantJ Points 888

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

17voto

Thomas Watson Points 37

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X