Qui est le meilleur moyen pour concaténer une chaîne de caractères en Python?
Depuis Python string
ne peut pas être changé, je me demandais comment concaténer une chaîne de manière plus efficace?
Je peux écrire comme ça:
s += stringfromelsewhere
ou comme ceci:
s = []
s.append(somestring)
later
s = ''.join(s)
Lors de l'écriture de cette question, j'ai trouvé un bon article qui parle de ce sujet.
http://www.skymind.com/~ocrow/python_string/
Mais c'est en Python 2.x., donc la question serait fait quelque chose de changer en Python 3?
Vous devez vous connecter pour publier un commentaire.
La meilleur façon d'ajouter une chaîne à une variable de chaîne est d'utiliser
+
ou+=
. C'est parce que c'est lisible et rapide. Ils sont également tout aussi rapide, celle que vous choisissez est une question de goût, le dernier est le plus commun. Voici les timings avec letimeit
module:Cependant, ceux qui recommandent de faire des listes et en les ajoutant à eux et ensuite se joindre à ces listes, le faire parce que ajoutant une chaîne à une liste est sans doute très rapide par rapport à l'extension d'une chaîne de caractères. Et cela peut être vrai dans certains cas. Ici, par exemple, est un
millions ajoute d'une chaîne d'un caractère, d'abord dans une chaîne de caractères, puis à une liste:
OK, il s'avère que, même si la chaîne résultante est d'un million de caractères, en ajoutant a été encore plus rapide.
Essayons maintenant avec l'ajout d'un millier de caractères chaîne longue d'une centaine de milliers de fois:
La fin de la chaîne, par conséquent, finit par être d'environ 100 mo de long. C'était assez lent, en ajoutant à une liste a été beaucoup plus rapide. Que ce calendrier n'inclut pas la finale
a.join()
. Alors combien de temps cela prendrait-il?Oups. S'avère même dans ce cas, ajouter/jointure est plus lent.
D'où vient donc cette recommandation vient? Python 2?
Bien, ajouter/join est légèrement plus rapide si vous utilisez de très longues chaînes (qui ne sont pas habituellement, qu'auriez-vous une chaîne de 100 MO en mémoire?)
Mais le facteur décisif est Python 2.3. Où je ne vais même pas vous montrer les timings, parce que c'est tellement lent qu'il n'est pas encore fini. Ces tests prennent soudainement minutes. Sauf pour l'ajout/la rejoindre, ce qui est tout aussi rapide que sous plus tard Pythons.
Yup. La concaténation de chaîne a été très lente en Python depuis l'âge de pierre. Mais sur 2.4 il n'est pas plus (ou au moins Python 2.4.7), de sorte que la recommandation de l'utilisation de ajout/join est devenu obsolète en 2008, quand Python 2.3 cessé d'être mis à jour, et vous devriez avoir cessé de l'utiliser. 🙂
(Mise à jour: s'avère quand j'ai fait le test avec plus de soin qu'à l'aide de
+
et+=
est plus rapide pour les deux chaînes sur Python 2.3 ainsi. La recommandation d'utiliser''.join()
doit être un malentendu)Cependant, ce n'est Disponible. D'autres implémentations peuvent avoir d'autres préoccupations. Et c'est juste encore une autre raison pourquoi l'optimisation prématurée est la racine de tous les maux. Ne pas utiliser une technique qui est censé "plus vite", sauf si vous la mesurer.
Donc la "meilleure" version pour faire la concaténation de chaîne est d'utiliser + ou +=. Et si cela s'avère être lent pour vous, ce qui est assez rare, alors faites quelque chose d'autre.
Alors, pourquoi faire j'ai utiliser beaucoup de ajouter/rejoindre dans mon code? Parce que parfois, c'est plus clair. Surtout quand tout ce que vous devez concaténer doivent être séparés par des espaces ou des virgules ou des retours à la ligne.
+
et+=
est plus rapide ou plus rapide dans tous les cas, lors de l'assemblage de deux chaînes et toutes les plateformes, sauf peut-être dans certains cas extrêmes, je n'ai pas trouvé. youtu.être/50OIO9ONmks?t=18m09s Diapositives: slides.colliberty.com/DjangoConEU-2013/#/step-40a += b
est aussi rapide, voire plus rapide que''.join([a, b])
, et''.join(alonglist)
est plus rapide que la boucle sur alonglist et la concaténation un par un.Si vous êtes à la concaténation d'un nombre important de valeurs, alors que ni. Ajout d'une liste est cher. Vous pouvez utiliser StringIO pour que. Surtout si vous êtes à la bâtir sur un grand nombre d'opérations.
Si vous avez déjà une liste complète retourné à partir d'une autre opération, alors il suffit d'utiliser la
''.join(aList)
De l'python FAQ: Quel est le moyen le plus efficace pour concaténer plusieurs chaînes?
Edit: j'ai été stupide et avait les résultats collé à l'envers, comme s'ajoutant à une liste a été plus rapide que cStringIO. J'ai également ajouté des tests pour bytearray/str concat, ainsi qu'une deuxième série de tests à l'aide d'une liste plus large avec les plus grandes chaînes. (python 2.7.3)
ipython exemple de test pour les grandes listes de chaînes
cStringIO
n'existe pas dans Py3. Utilisationio.StringIO
à la place.En Python >= 3.6, la nouvelle f-chaîne est un moyen efficace pour concaténer une chaîne de caractères.
La méthode recommandée est encore à ajouter utiliser et de le rejoindre.
Si les cordes sont la concaténation sont des littéraux, utilisez Un littéral de chaîne de concaténation
Ceci est utile si vous voulez faire des commentaires sur une partie d'une chaîne (comme ci-dessus), ou si vous souhaitez utiliser chaînes brutes ou triple devis pour une partie d'un littéral mais pas tous.
Depuis ce qui se passe au niveau de la syntaxe de la couche, il utilise zéro des opérateurs de concaténation.
En utilisant à la place de concaténation de chaîne par '+' est LA PIRE méthode de concaténation en termes de stabilité et de la croix de la mise en œuvre ne prend pas en charge toutes les valeurs. PEP8 standard décourage ce et encourage l'utilisation de la fonction format(), join() et append() pour l'utilisation à long terme.
Un peu daté, Code Comme un Pythonista: Idiomatiques Python recommande
join()
sur+
dans cette section. Comme PythonSpeedPerformanceTips dans son article sur la concaténation de chaîne, avec l'avertissement suivant:Vous écrire cette fonction
Ensuite, vous pouvez appeler simplement où vous voulez
str_join = lambda *str_list: ''.join(s for s in str_list)
Comme @jdi mentionne la documentation Python suggère d'utiliser des
str.join
ouio.StringIO
pour la concaténation de chaîne. Et dit qu'un développeur doit s'attendre quadratique du temps de+=
dans une boucle, même si il y a une optimisation depuis Python 2.4. Comme cette réponse dit:Je vais vous montrer un exemple de code qui naïvement invoqué
+=
cette optimisation, mais il ne s'applique pas. Le code ci-dessous convertit un objet iterable chaînes courtes dans les gros morceaux à être utilisé dans un en vrac.Ce code peut littéraire courir pendant des heures en raison de la complexité quadratique du temps. Ci-dessous sont des solutions de rechange aux suggestions de structures de données:
Et un micro-benchmark:
mon cas d'utilisation a été légèrement différentes. J'ai dû construire une requête où plus de 20 champs ont été dynamiques.
J'ai suivi cette approche de l'utilisation de la méthode de mise en forme
cela a été relativement plus simple pour moi au lieu de l'aide de + ou d'autres moyens
Vous pouvez l'utiliser(la plus efficace) trop. (https://softwareengineering.stackexchange.com/questions/304445/why-is-s-better-than-for-concatenation)