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 3.8KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. title: Optimisation des chaînes de caractères en Python : le retour !
  2. slug: optimisation-des-chaines-de-caracteres-en-python-le-retour
  3. date: 2006-01-27 12:37:20
  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 les <a href="https://larlet.fr/david/biologeek/archives/20060121-optimisation-des-chaines-de-caracteres-en-python/">épisodes précédents</a>, je m'étonnais de voir des concaténations de chaînes de caractères être plus rapide que des remplissages de listes. Depuis je cogite car il est indiqué un peu partout qu'il faut privillégier les listes. Et j'ai fini par trouver une réponse :-).</p>
  13. <p>Considérons la même chaîne de caractères&nbsp;:</p>
  14. <pre>strings = ["tagada"]*1000000 + ["tsouintsouin"]*1000000</pre>
  15. <p>Et la même fonction <strong>foo2()</strong>&nbsp;:</p>
  16. <pre>def foo2():
  17. string_final = []
  18. for string in strings:
  19. if not "tsouin" in string:
  20. string_final.append(string)
  21. return "".join(string_final)</pre>
  22. <p>Donc cette fonction met environ <strong>4,70 secondes</strong> à créer cette énorme chaîne de caractères. Ce que j'avais alors oublié de tester, ce sont les alias. En effet, les fonctions de type <strong>list.append</strong> sont réévaluées à chaque itération en python, ce qui fait perdre un temps fou, la preuve en chiffres&nbsp;:</p>
  23. <pre>def foo3():
  24. string_final = []
  25. app = string_final.append
  26. for string in strings:
  27. if not "tsouin" in string:
  28. app(string)
  29. return "".join(string_final)</pre>
  30. <p>Et là on tombe à <strong>3,50 secondes</strong>&nbsp;! Ainsi les listes peuvent être plus rapides que les concaténations de chaînes de caractères, encore faut-il pouvoir créer un alias...</p>
  31. <p>Bon et puisque j'y suis, une autre petite astuce d'optimisation&nbsp;: on peut lire dans les <a href="http://www.zope.org/Wikis/DevSite/Projects/ComponentArchitecture/CodeOptimization">astuces d'optimisation de Zope</a> qu'il vaut mieux utiliser les méthodes du module string plutôt que des portions de listes. Bon dit comme ça on comprend pas trop de quoi je parle alors un petit exemple pour clarifier tout ça&nbsp;:</p>
  32. <pre>def foo4():
  33. string_final = ""
  34. for string in strings:
  35. if string[:5] == "tagad":
  36. string_final += string
  37. return string_final
  38. def foo5():
  39. string_final = ""
  40. for string in strings:
  41. if string.startswith("tagad"):
  42. string_final += string
  43. return string_final</pre>
  44. <p>La méthode <strong>foo4()</strong> s'exécute en <strong>7,2 secondes</strong> et <strong>foo5()</strong> en <strong>12 secondes</strong>... tiens c'est le contraire qui est obtenu ici, me serais-je trompé&nbsp;? Je revérifie et non j'ai bien ces temps là d'exécution, soit presque le double lorsque l'on utilise les méthodes du module string.</p>
  45. <p>Première conclusion&nbsp;: vérifiez toujours les astuces d'optimisation qu'on vous propose (ceci est valable pour celles-ci aussi) car elle peuvent évoluer selon les versions de Python ou du contexte par exemple.</p>
  46. <p>Seconde conclusion&nbsp;: les listes finalement c'est pas si mal pour traiter les chaînes de caractères :-).</p>
  47. <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>