UKOnline

Concaténation de chaines de caractères

Le premier élément d'attention pour un code « pythonique » concerne les chaines de caractères. En Python, elles sont représentées par le type str qui définit des chaines de caractères immuables, c'est-à-dire dont la valeur ne peut être modifiée une fois la chaine de caractères créée. Il n'est, par exemple, pas possible d'écrire ceci :

Le message d'erreur qui est produit indique clairement que les objets de type str ne supportent pas l'affectation de leurs éléments :

Traceback (most recent call last):
  File "program.py", line 2, in <module>
    s[11] = '!'
TypeError: 'str' object does not support item assignment

Mais que se passe-t-il donc lorsque l'on utilise l'opérateur de concaténation des chaines de caractères ? Cet opérateur construit en fait une nouvelle chaine de caractères qui est le résultat de la concaténation de ses deux opérandes. Par exemple, au terme de l'exécution du programme suivant, trois objets str ont été créés en mémoire :

La première instruction crée la chaine de caractères 'Hello'. La seconde instruction commence par créer 'World', et puis crée une nouvelle chaine de caractères contenant le résultat de la concaténation, à savoir 'HelloWorld'. À la fin, la variable s fera référence à ce résultat et le ramasse-miettes (le ramasse-miettes, ou garbage collector en anglais, supprime régulièrement de la mémoire les objets qui ne sont plus référencés par aucune variable) finira par supprimer les deux autres chaines de caractères de la mémoire, tôt ou tard.

Voyons un autre exemple de programme avec des concaténations :

Un total de cinq chaines de caractères ont été créés en mémoire. En effet, chaque application de l'opérateur de concaténation créant un nouvel objet, la troisième instruction en crée trois, en plus des deux créées par les deux premières instructions.

Deux techniques peuvent être utilisées pour améliorer le temps d'exécution de programmes nécessitant de nombreuses concaténations.

Méthode join

Lorsqu'il s'agit de concaténer un grand nombre de chaines de caractères, il est plus efficace d'utiliser la méthode join des objets str plutôt que d'utiliser l'opérateur de concaténation. Voici deux fonctions qui permettent de concaténer $n$ fois la chaine de caractères 'Nom' :

La seconde fonction est bien plus rapide que la première. En effet, on passe de 172 ms à 114 ms pour concaténer un million de fois la chaine de caractères 'Nom', soit une diminution de temps de 34 %. On peut encore améliorer ce gain de temps en utilisant les listes en compréhension, décrites à la section suivante.

Méthode format

Lorsqu'il s'agit de concaténer des chaines de caractères avec des valeurs et variables d'autres types, il est plus efficace d'utiliser la méthode format des objets str ou les f-strings, plutôt que d'utiliser l'opérateur de concaténation. Voici trois fonctions qui permettent de calculer les $n$ premières lignes de la table de multiplication par $10$ :

La deuxième fonction est plus rapide que la première. En effet, on passe de 102 ms à 75 ms pour concaténer les cent-mille premières lignes de la table de multiplication par $10$, soit une diminution de temps de 26 %.

Avec la troisième fonction, les performances sont encore meilleures, menant à un temps d'exécution de 57 ms, soit une diminution de temps de 44 % par rapport à la première fonction. On peut faire encore mieux avec les listes en compréhension, décrites à la section suivante.