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.

index.html 7.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. <!doctype html>
  2. <html lang=fr>
  3. <head>
  4. <!-- Always define the charset before the title -->
  5. <meta charset=utf-8>
  6. <title>Optimisation des chaînes de caractères en Python — Biologeek — David Larlet</title>
  7. <!-- Define a viewport to mobile devices to use - telling the browser to assume that the page is as wide as the device (width=device-width) and setting the initial page zoom level to be 1 (initial-scale=1.0) -->
  8. <meta name="viewport" content="width=device-width, initial-scale=1"/>
  9. <!-- Fake favicon, to avoid extra request to the server -->
  10. <link rel="icon" href="data:;base64,iVBORw0KGgo=">
  11. <link type="application/atom+xml" rel="alternate" title="Feed" href="/david/log/" />
  12. <link rel="manifest" href="/manifest.json">
  13. <link rel="stylesheet" href="/static/david/css/larlet-david-_J6Rv.css" data-instant-track />
  14. <noscript>
  15. <style type="text/css">
  16. /* Otherwise fonts are loaded by JS for faster initial rendering. See scripts at the bottom. */
  17. body {
  18. font-family: 'EquityTextB', serif;
  19. }
  20. h1, h2, h3, h4, h5, h6, time, nav a, nav a:link, nav a:visited {
  21. font-family: 'EquityCapsB', sans-serif;
  22. font-variant: normal;
  23. }
  24. </style>
  25. </noscript>
  26. <!-- Canonical URL for SEO purposes -->
  27. <link rel="canonical" href="https://larlet.fr/david/biologeek/archives/20060121-optimisation-des-chaines-de-caracteres-en-python">
  28. </head>
  29. <body>
  30. <div>
  31. <header>
  32. <nav>
  33. <p>
  34. <small>
  35. Je suis <a href="/david/" title="Profil public">David Larlet</a>, <a href="/david/pro/" title="Activité professionnelle">artisan</a> du web qui vous <a href="/david/pro/accompagnement/" title="Activité d’accompagnement">accompagne</a><span class="more-infos"> dans l’acquisition de savoirs pour concevoir des <a href="/david/pro/produits-essentiels/" title="Qu’est-ce qu’un produit essentiel ?">produits essentiels</a></span>. <span class="more-more-infos">Discutons ensemble d’une <a href="/david/pro/devis/" title="En savoir plus">non-demande de devis</a>.</span> Je partage ici mes <a href="/david/blog/" title="Expériences bienveillantes">réflexions</a> et <a href="/david/correspondances/2017/" title="Lettres hebdomadaires">correspondances</a>.
  36. </small>
  37. </p>
  38. </nav>
  39. </header>
  40. <section>
  41. <h1 property="schema:name">Optimisation des chaînes de caractères en Python</h1>
  42. <article typeof="schema:BlogPosting">
  43. <div property="schema:articleBody">
  44. <img src="/static/david/biologeek/images/logos/bonnes_pratiques_python.png" alt="vignette" style="float:left; margin: 0.5em 1em;" property="schema:thumbnailUrl" />
  45. <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>
  46. <p>Considérons une chaîne de caractères assez conséquente&nbsp;:</p>
  47. <pre>strings = ["tagada"]*1000000 + ["tsouintsouin"]*1000000</pre>
  48. <p>Puis une fonction concaténant tous les tagada&nbsp;:</p>
  49. <pre>def foo1():
  50. string_final = ""
  51. for string in strings:
  52. if not "tsouin" in string:
  53. string_final += string
  54. return string_final</pre>
  55. <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>
  56. <pre>def foo2():
  57. string_final = []
  58. for string in strings:
  59. if not "tsouin" in string:
  60. string_final.append(string)
  61. return "".join(string_final)</pre>
  62. <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>
  63. <pre>def foo3():
  64. return "".join([string for string in strings if not "tsouin" in string])</pre>
  65. <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>
  66. <pre>def foo4():
  67. string_final = ""
  68. for string in strings:
  69. if not "tsouin" in string:
  70. string_final += string + "separateur"
  71. return string_final.split("separateur")
  72. def foo5():
  73. string_final = []
  74. for string in strings:
  75. if not "tsouin" in string:
  76. string_final.append(string)
  77. return string_final</pre>
  78. <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>
  79. <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>
  80. <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>
  81. <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>
  82. </div>
  83. </article>
  84. <footer>
  85. <h6 property="schema:datePublished">— 21/01/2006</h6>
  86. </footer>
  87. </section>
  88. <section>
  89. <div>
  90. <h3>Articles peut-être en rapport</h3>
  91. <ul>
  92. <li><a href="/david/biologeek/archives/20080511-bonnes-pratiques-et-astuces-python/" title="Accès à Bonnes pratiques et astuces Python">Bonnes pratiques et astuces Python</a></li>
  93. <li><a href="/david/biologeek/archives/20061025-benchmarks-map-filter-vs-list-comprehensions/" title="Accès à Benchmarks map, filter vs. list-comprehensions">Benchmarks map, filter vs. list-comprehensions</a></li>
  94. <li><a href="/david/biologeek/archives/20060425-python-et-underscore/" title="Accès à Python : lisibilité vs simplicité">Python : lisibilité vs simplicité</a></li>
  95. </ul>
  96. </div>
  97. </section>
  98. <section>
  99. <div id="comments">
  100. <h3>Commentaires</h3>
  101. </div>
  102. </section>
  103. <footer>
  104. <nav>
  105. <p>
  106. <small>
  107. Je réponds quasiment toujours aux <a href="m&#x61;ilto:d&#x61;vid%40l&#x61;rlet&#46;fr" title="Envoyer un email">emails</a> (<a href="/david/signature/" title="Ma signature actuelle avec possibilité de chiffrement">signés</a>) et vous pouvez me rencontrer à Montréal. <span class="more-infos">N’hésitez pas à <a href="/david/log/" title="Être tenu informé des mises à jour">vous abonner</a> pour être tenu informé des publications récentes.</span>
  108. </small>
  109. </p>
  110. </nav>
  111. </footer>
  112. </div>
  113. <script src="/static/david/js/larlet-david-3ee43f.js" data-no-instant></script>
  114. <script data-no-instant>InstantClick.init()</script>
  115. </body>
  116. </html>