Vous mesurez la concaténation de deux chaines, essayez avec 1000 et le résultat non seulement en temps, mais également en utilisation de mémoire, sera sans appel.
Et pour expliquer la différence, a + b
c'est :
- une allocation dynamique pour le resultat,
- 1 copie de
a
,
- 1 copie de
b
Prenons maintenant a + b + c
= (a + b) + c
(sans optimisation particulière) :
- 1 allocation,
- 1 copie de
a
,
- 1 copie de
b
,
- 1 allocation,
- 1 copie de
a + b
, soit :
- 1 copie de
a
,
- 1 copie de
b
,
- 1 copie de
c
- 1 suppression du resultat intermédiaire
a + b
Soit deux allocations et 5 copies.
Prenons maintenant ''.join((a, b, c))
:
- 1 allocation,
- copie de
a
,
- copie de
b
,
- copie de
c
Soit 1 allocation et 3 copies.
Extrapolez ça à la concaténation de N chaînes :
+
: N-1 allocations de mémoire, (N(N+1)/2)+1 (soit du O(N^2)) copies, N-2 résultats intermédiaires supprimés par le GC.
join
: 1 allocation de mémoire, N copies et 0 résultat intermédiaire.
Maintenant il y a moyen que Python optimise les longues sommes de chaînes, sauf que dans la pratique ces longues concaténations sont faites sur plusieurs lignes avec des étapes intermédiaires (des suites de res +=...
), et que Python n'optimise certainement pas ce cas.
Moralité, réalisez toujours la concaténation de N > 2 chaînes avec join
et interdisez-vous l'opérateur +
. Votre RAM et le garbage collector de Python vous diront merci.