El meilleur Pour ajouter une chaîne de caractères à une variable de type chaîne de caractères, il faut utiliser la méthode suivante +
ou +=
. C'est parce qu'il est lisible et rapide. Ils sont également tout aussi rapides, celui que vous choisissez est une question de goût, ce dernier est le plus courant. Voici les timings avec le timeit
module :
a = a + b:
0.11338996887207031
a += b:
0.11040496826171875
Cependant, ceux qui recommandent d'avoir des listes et d'y ajouter des éléments, puis de joindre ces listes, le font parce que l'ajout d'une chaîne à une liste est vraisemblablement très rapide par rapport à l'extension d'une chaîne. Et cela peut être vrai, dans certains cas. Voici, par exemple, un million d'ajouts d'une chaîne d'un caractère, d'abord à une chaîne, puis à une liste :
a += b:
0.10780501365661621
a.append(b):
0.1123361587524414
OK, il s'avère que même lorsque la chaîne résultante compte un million de caractères, l'ajout est toujours plus rapide.
Essayons maintenant d'ajouter cent mille fois une chaîne de mille caractères :
a += b:
0.41823482513427734
a.append(b):
0.010656118392944336
La chaîne finale finit donc par faire environ 100 Mo. C'est assez lent, l'ajout à une liste est beaucoup plus rapide. Ce temps n'inclut pas le processus final a.join()
. Alors, combien de temps cela prendrait-il ?
a.join(a):
0.43739795684814453
Oups. Il s'avère que même dans ce cas, append/join est plus lent.
Alors, d'où vient cette recommandation ? De Python 2 ?
a += b:
0.165287017822
a.append(b):
0.0132720470428
a.join(a):
0.114929914474
Eh bien, append/join est marginalement plus rapide là si vous utilisez des chaînes extrêmement longues (ce qui n'est généralement pas le cas, qu'est-ce que vous auriez d'une chaîne de 100 Mo de mémoire).
Mais le véritable argument décisif est Python 2.3. Où je ne vous montrerai même pas les chronologies, car il est si lent qu'il n'a pas encore terminé. Ces tests prennent soudainement minutes . Sauf pour l'append/join, qui est tout aussi rapide que sous les Python ultérieurs.
Yup. La concaténation de chaînes était très lente en Python à l'âge de pierre. Mais sur 2.4, elle ne l'est plus (ou du moins Python 2.4.7), donc la recommandation d'utiliser append/join est devenue obsolète en 2008, lorsque Python 2.3 a cessé d'être mis à jour, et vous auriez dû cesser de l'utiliser :-)
(Mise à jour : il s'est avéré, lorsque j'ai effectué les tests plus attentivement, que l'utilisation de +
y +=
est plus rapide pour deux chaînes de caractères sous Python 2.3 également. La recommandation d'utiliser ''.join()
doit être un malentendu)
Cependant, il s'agit de CPython. D'autres implémentations peuvent avoir d'autres préoccupations. Et ce n'est qu'une raison de plus pour laquelle l'optimisation prématurée est la racine de tous les maux. N'utilisez pas une technique supposée "plus rapide" sans l'avoir d'abord mesurée.
Par conséquent, la "meilleure" version pour faire la concaténation de chaînes de caractères est d'utiliser + ou +=. . Et si cela s'avère lent pour vous, ce qui est plutôt improbable, alors faites autre chose.
Alors pourquoi est-ce que j'utilise beaucoup d'append/join dans mon code ? Parce que parfois, c'est plus clair. Surtout quand ce que vous devez concaténer doit être séparé par des espaces, des virgules ou des retours à la ligne.
1 votes
stackoverflow.com/questions/10043636/