Disons que vous avez ce code pour construire une chaîne de caractères à partir de trois chaînes:
x = 'foo'
x += 'bar' # 'foobar'
x += 'baz' # 'foobarbaz'
Dans ce cas, Python a d'abord besoin d'allouer et de créer 'foobar'
avant d'allouer et de créer 'foobarbaz'
.
Donc, pour chaque +=
qui est appelée, l'ensemble du contenu de la chaîne et tout ce qui est arriver, ajouté à cela doivent être copiés dans un tout nouveau mémoire tampon. En d'autres termes, si vous avez N
cordes à être rejoint, vous avez besoin d'allouer environ N
temporaire des chaînes et de la première sous-chaîne est copié ~N fois. La dernière sous-chaîne obtient seulement une fois copié, mais en moyenne, chaque sous-chaîne est copié ~N/2
temps.
Avec .join
, Python peut jouer un certain nombre de tours depuis l'intermédiaire de chaînes n'ont pas besoin d'être créé. Disponible les chiffres de la mémoire dont il a besoin à l'avant et répartit correctement la taille de la mémoire tampon. Enfin, il copie ensuite chaque morceau dans le nouveau tampon, ce qui signifie que chaque pièce est seulement une fois copié.
Il existe d'autres approches viables qui pourrait conduire à de meilleures performances pour +=
dans certains cas. E. g. si la représentation de chaîne est en fait un rope
ou si le moteur d'exécution est en fait assez intelligent pour en quelque sorte la figure que les chaînes temporaires sont d'aucune utilité pour le programme et de les optimiser à l'écart.
Cependant, Disponible certainement ne pas faire ces optimisations de manière fiable (même si ça peut un peu le coin des cas) et depuis c'est la plus commune de mise en œuvre en cours d'utilisation, de nombreuses bonnes pratiques sont basées sur ce qui fonctionne bien pour Disponible. Avoir un ensemble normalisé de normes rend également plus facile pour les autres implémentations de concentrer leurs efforts d'optimisation.