Python équivalent de Java StringBuffer?
Est-il rien en Python comme Java StringBuffer
? Depuis les chaînes sont immuables en Python aussi, leur montage en boucle serait inefficace.
- Vous pouvez obtenir un effet similaire en la construction d'une liste de chaînes de caractères et à l'aide de
join()
après la boucle. Mais je suis sûr qu'il ya plus pythonic moyen (impliquant probablement compréhension de liste).
Vous devez vous connecter pour publier un commentaire.
Efficace de Concaténation de Chaîne en Python est un vieux article et de ses principaux déclaration que les naïfs concaténation est beaucoup plus lent que de joindre n'est plus valable, parce que cette partie a été optimisé Disponible depuis:
J'ai adapté à leur code un peu et a obtenu les résultats suivants sur ma machine:
Résultats:
Conclusions:
join
gagne encore plus de concat, mais de façon marginaleDépend de ce que vous voulez faire. Si vous voulez une mutable séquence, le groupe builtin
list
type est votre ami, et va de str à la liste et à l'arrière est aussi simple que:Si vous voulez construire une chaîne de grande taille à l'aide d'une boucle for, l'pythonic moyen est généralement de créer une liste de chaînes de caractères puis de se joindre à eux avec le bon séparateur (saut de ligne ou quoi que ce soit).
Sinon vous pouvez aussi utiliser du texte système de template, ou un analyseur ou que ce soit spécialisé est l'outil le plus approprié pour le travail.
str.join()
méthode est O(n) la complexité. Par la documentation officielle: "Pour la performance sensible code, il est préférable d'utiliser lestr.join()
méthode qui assure compatible linéaire performances de concaténation dans les versions et mises en oeuvre."Peut-être utiliser une bytearray:
L'appel de l'aide d'un objet bytearray est sa mémoire et de l'efficacité pratique de la syntaxe. Il peut également être plus rapide que l'utilisation temporaire de la liste:
Noter qu'une grande partie de la différence de vitesse est attribuable à la création du conteneur:
str
, l'encodage est à vous. Aussi loin que l'bytearray
est concerné, chaque valeur est juste un octet.['s', 't', 'r', 'i', 'n', 'g']
?mylist
dans bruno desthuilliers code.Précédemment fourni des réponses sont presque toujours le meilleur. Cependant, parfois, la chaîne est construite à travers de nombreux appels de méthode et/ou de boucles, de sorte qu'il n'est pas forcément naturel pour créer une liste de lignes et ensuite se joindre à eux. Et depuis il n'y a aucune garantie que vous utilisez Disponible ou Disponible d'optimisation doit s'appliquer, puis une autre approche consiste à n'utiliser que de l'imprimer!
Voici un exemple de la classe helper, bien que la classe helper est trivial et sans doute inutile, il sert à illustrer l'approche (Python 3):
ce lien peut être utile pour la concaténation en python
http://pythonadventures.wordpress.com/2010/09/27/stringbuilder/
exemple de lien ci-dessus:
Juste un test, je tourne sur python 3.6.2 en montrant que "rejoindre" encore gagner GROS!
Et le résultat a été:
J'ai ajouté à Roee Gavirel code 2 tests supplémentaires qui montrent de façon concluante que l'adhésion à des listes de chaînes en est pas plus vite que le s += "quelque chose".
Résultats:
Code: