Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

article.md 4.1KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. title: Optimisation des chaînes de caractères en Python
  2. slug: optimisation-des-chaines-de-caracteres-en-python
  3. date: 2006-01-21 20:13:01
  4. type: post
  5. vignette: images/logos/bonnes_pratiques_python.png
  6. contextual_title1: Bonnes pratiques et astuces Python
  7. contextual_url1: 20080511-bonnes-pratiques-et-astuces-python
  8. contextual_title2: Benchmarks map, filter vs. list-comprehensions
  9. contextual_url2: 20061025-benchmarks-map-filter-vs-list-comprehensions
  10. contextual_title3: Python : lisibilité vs simplicité
  11. contextual_url3: 20060425-python-et-underscore
  12. <p>Dans quelles situations utiliser les chaînes de caractère&nbsp;? Pourquoi pas des listes&nbsp;? Et les list-comprehension dans tout ça&nbsp;? Réponses en tests, c'est plein de strings mais ne vous inquiétez pas, rien de sexuel ;)</p>
  13. <p>Considérons une chaîne de caractères assez conséquente&nbsp;:</p>
  14. <pre>strings = ["tagada"]*1000000 + ["tsouintsouin"]*1000000</pre>
  15. <p>Puis une fonction concaténant tous les tagada&nbsp;:</p>
  16. <pre>def foo1():
  17. string_final = ""
  18. for string in strings:
  19. if not "tsouin" in string:
  20. string_final += string
  21. return string_final</pre>
  22. <p>Nous obtenons une fonction qui met <strong>4,44 secondes</strong> pour renvoyer une longue chaîne. Pas vraiment rapide, je suis sûr qu'on pourrait aller plus vite avec des listes&nbsp;:</p>
  23. <pre>def foo2():
  24. string_final = []
  25. for string in strings:
  26. if not "tsouin" in string:
  27. string_final.append(string)
  28. return "".join(string_final)</pre>
  29. <p>Cette fois ce sont <strong>4,65 secondes</strong> qui sont nécessaires pour effectuer la même opération... l'ajout d'un élément à une liste est donc très coûteux en temps aussi&nbsp;! Et c'est loin des «&nbsp;<a href="http://wikipython.flibuste.net/moin.py/BonnesPratiques#head-1c5e141b2f386f3757d49d2fbce14170aed3a687">centaines de fois</a> » plus rapide qui peuvent être annoncées. C'est d'ailleurs la raison pour laquelle il existe les comprehension-lists&nbsp;:</p>
  30. <pre>def foo3():
  31. return "".join([string for string in strings if not "tsouin" in string])</pre>
  32. <p>Qui ne mettent dans ce cas là que <strong>3,25 secondes</strong>&nbsp;! Voila qui fait réfléchir lors de votre prochaine implémentation ;-). Mais au fait s'il est aussi coûteux en temps d'ajouter des éléments à une liste, pourquoi ne pas créer une chaîne de caractères que l'on découpe ensuite en une liste ?! Farfelu&nbsp;? Vérifions&nbsp;:</p>
  33. <pre>def foo4():
  34. string_final = ""
  35. for string in strings:
  36. if not "tsouin" in string:
  37. string_final += string + "separateur"
  38. return string_final.split("separateur")
  39. def foo5():
  40. string_final = []
  41. for string in strings:
  42. if not "tsouin" in string:
  43. string_final.append(string)
  44. return string_final</pre>
  45. <p>La première fonction renvoie une liste en <strong>17,8 secondes</strong>, la seconde en <strong>4,31 secondes</strong>, en effet c'était farfelu. Et avec une list-comprehension&nbsp;? Théoriquement encore plus rapide que précédemment puisque qu'il y a un <strong>join()</strong> en moins, je vous laisse vérifier.</p>
  46. <p>Conclusion&nbsp;: utilisez les list-comprehension au maximum lorsque c'est possible quitte à faire des <strong>[foo(string) for string in strings]</strong> s'il y a de gros post-traitements de <strong>string</strong>. Quant à l'utilisation de concaténation de chaînes de caractères contre l'ajout à une liste, le temps où les listes étaient beaucoup plus rapides est apparemment révolu, choisissez donc en fonction du type de données et non de la rapidité...</p>
  47. <p><strong>[Edit/Erratum]</strong>&nbsp;: un billet suivant explique une <a href="https://larlet.fr/david/biologeek/archives/20060127-optimisation-des-chaines-de-caracteres-en-python-le-retour/">nouvelle méthode d'utilisation des listes plus rapide que les chaînes de caractères</a>.</p>
  48. <p>Je vous rappelle qu'un billet récapitule l'ensemble des <a href="https://larlet.fr/david/biologeek/archives/20060121-bonnes-pratiques-de-la-programmation-en-python/">bonnes pratiques et optimisations en Python</a>.</p>