3
votes

Méthode la plus efficace pour concaténer des chaînes en Python

Au moment de poser cette question, j'utilise Python 3.8

Quand je dis efficace, je me réfère uniquement à la vitesse à laquelle les chaînes sont concaténées, ou en termes plus techniques: je pose la question de la complexité du temps, pas de la prise en compte de la complexité de l'espace.

Les seules méthodes auxquelles je peux penser pour le moment sont les 3 suivantes étant donné que:

>>> import timeit

>>> print(timeit.Timer('result = a + b', setup='a = "start"; b = " end"').timeit(number=10000))
0.0005306000000473432

>>> print(timeit.Timer('result = "".join((a, b))', setup='a = "start"; b = " end"').timeit(number=10000))
0.0011297000000354274

>>> print(timeit.Timer('result = "{0}{1}".format(a, b)', setup='a = "start"; b = " end"').timeit(number=10000))
0.002327799999989111

>>> print(timeit.Timer('result = f"{a}{b}"', setup='a = "start"; b = " end"').timeit(number=10000))
0.0005772000000092703

>>> print(timeit.Timer('result = "%s%s" % (a, b)', setup='a = "start"; b = " end"').timeit(number=10000))
0.0017815999999584164

Méthode 1

result = a + b

Méthode 2

result = ''.join((a, b))

Méthode 3

result = '{0}{1}'.format(a, b)

Je veux savoir lesquelles de ces méthodes sont les plus rapides ou s'il existe d'autres méthodes plus efficaces. De plus, si vous savez si l'une de ces méthodes fonctionne différemment avec plus de chaînes ou des chaînes plus longues, veuillez l'inclure dans votre réponse.

Éditer

Après avoir vu tous les commentaires et réponses, j'ai appris quelques nouvelles façons de concaténer des chaînes, et j'ai également découvert la bibliothèque timeit . Je rapporterai mes conclusions personnelles ci-dessous:

a = 'start'
b = ' end'

Il semble que pour ces petites chaînes, la méthode traditionnelle a + b soit la plus rapide pour la concaténation de chaînes. Merci pour toutes les réponses!


4 commentaires

utilisez timeit ou horlogerie pour obtenir une mesure!


Vous devez profiler différentes méthodes et rapporter vos résultats pour aider les autres.


voir s'il y a un décalage horaire entre la méthode 3 et f "{a} {b}" aussi


Notez que chaque fois que les tests que vous pouvez effectuer sont sensibles à la longueur de chaque chaîne.


3 Réponses :


4
votes

Pour exactement deux chaînes a et b , utilisez simplement a + b . Les alternatives sont pour joindre plus de 2 chaînes, en évitant l'objet str temporaire créé par chaque utilisation de + , ainsi que le comportement quadratique dû à la copie répétée du contenu des opérations précédentes dans le résultat suivant.

(Il y a aussi f'{a}{b}' , mais il est syntaxiquement plus lourd et pas plus rapide que a + b .)


0 commentaires

4
votes

Pourquoi ne pas l'essayer? Vous pouvez utiliser timeit.timeit () pour exécuter une instruction plusieurs fois et renvoyer la durée globale.

Ici, nous utilisons s pour configurer les variables a et b (non incluses dans le temps global), puis exécutons les différentes options 10 millions de fois.

>>> from timeit import timeit
>>>
>>> n = 10 * 1000 * 1000
>>> s = "a = 'start'; b = ' end'"
>>>
>>> timeit("c = a + b",                 setup=s, number=n)
0.4452877212315798
>>>
>>> timeit("c = f'{a}{b}'",             setup=s, number=n)
0.5252049304544926
>>>
>>> timeit("c = '%s%s'.format(a, b)",   setup=s, number=n)
0.6849184390157461
>>>>
>>> timeit("c = ''.join((a, b))",       setup=s, number=n)
0.8546998891979456
>>>
>>> timeit("c = '%s%s' % (a, b)",       setup=s, number=n)
1.1699129864573479
>>>
>>> timeit("c = '{0}{1}'.format(a, b)", setup=s, number=n)
1.5954962372779846

Cela montre qu'à moins que le goulot d'étranglement de votre application ne soit la concaténation de chaînes, cela ne vaut probablement pas la peine d'être trop préoccupé par ...

  • Le meilleur cas est d'environ 0,45 seconde pour 10 millions d'itérations, soit environ 45 ns par opération.
  • Le pire des cas est d'environ 1,59 seconde pour 10 millions d'itérations, soit environ 159 ns par opération.

Si vous effectuez littéralement des millions d'opérations, vous constaterez une amélioration de la vitesse d'environ 1 seconde.

Notez que vos résultats peuvent varier considérablement en fonction de la longueur (et du nombre) des chaînes que vous concaténez et du matériel sur lequel vous utilisez.


0 commentaires

1
votes
print(f'{a} {b}')

1 commentaires

Faites attention! Effectuer l'opération une seule fois introduira un bruit inutile - par exemple, vous constaterez probablement que la plupart de votre temps ici est passé à l'arrière de datetime.now() , print() et à l'avant de datetime.now() , plutôt que la concaténation de chaînes que vous aviez l'intention de mesurer (environ nanosecondes, par rapport aux microsecondes que vous signalez). .join() et .format() ne sont pas plus rapides que + .