Repository with sources and generator of https://larlet.fr/david/ https://larlet.fr/david/
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

article.md 4.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. title: Benchmarks map, filter vs. list-comprehensions
  2. slug: benchmarks-map-filter-vs-list-comprehensions
  3. date: 2006-10-25 19:00:06
  4. type: post
  5. vignette: images/logos/seb_sauvage.png
  6. contextual_title1: Bonnes pratiques et astuces Python
  7. contextual_url1: 20080511-bonnes-pratiques-et-astuces-python
  8. contextual_title2: Python : lisibilité vs simplicité
  9. contextual_url2: 20060425-python-et-underscore
  10. contextual_title3: Principales nouveautés dans Python 2.5
  11. contextual_url3: 20060304-principales-nouveautes-dans-python-25
  12. <p>Je viens de tomber sur les <a href="http://sebsauvage.net/python/snyppets/">snyppets de Seb Sauvage</a> (site que j'apprécie beaucoup par ailleurs) et il y a une phrase qui m'a interpellé sur le <a href="http://sebsauvage.net/python/snyppets/#zip_filter_map">paragraphe consacré à zip, map, filter et aux list-comprehensions</a>&nbsp;:</p>
  13. <blockquote><p>Except that {map|filter} is <strong>faster</strong>. (than list-comprehensions)</p></blockquote>
  14. <p>Ni une, ni deux, je récupère l'<a href="http://programmation-python.org/sections/blog/2006_10_05_article-sur-code">article de Tarek</a> qui est très bon et qui comporte une fonction testant la durée d'execution des fonctions pour pouvoir comparer. J'avais <a href="https://larlet.fr/david/biologeek/archives/20060121-bonnes-pratiques-de-la-programmation-en-python/">déjà essayé d'autres fonctions</a> mais autant innover un peu.</p>
  15. <p>Allons-y donc avec le décorateur suivant&nbsp;:</p>
  16. <pre>from test import pystone
  17. import time
  18. kPs = 1000
  19. TOLERANCE = 0.5 * kPs
  20. def mesure_pystone():
  21. pystone.pystones(loops=pystone.LOOPS)
  22. pystone.pystones(loops=pystone.LOOPS)
  23. return pystone.pystones(loops=pystone.LOOPS)
  24. def timedtest(function, local_pystones=mesure_pystone()):
  25. """ Decorator to measure execution time in pystones """
  26. def wrapper(*args, **kw):
  27. all = []
  28. for i in range(3):
  29. start_time = time.time()
  30. try:
  31. res = function(*args, **kw)
  32. finally:
  33. total_time = time.time() - start_time
  34. if total_time == 0:
  35. temps = 0
  36. else:
  37. ratio = local_pystones[0] / local_pystones[1]
  38. temps = total_time / ratio
  39. all.append(temps)
  40. print '%d pystones' % min(all)
  41. return res
  42. return wrapper</pre>
  43. <p>J'ai testé les fonctions suivantes qui ne sont pas les mêmes que les exemples de Seb mais qui retournent (elles, <a href="http://www.haypocalc.com/blog/">merci Haypo</a> :-)) le même résultat&nbsp;:</p>
  44. <pre>@timedtest
  45. def map_without_list_comprehension():
  46. for i in range(10000):
  47. map(abs, [-5,7,-12])
  48. @timedtest
  49. def map_with_list_comprehension():
  50. for i in range(10000):
  51. [abs(i) for i in [-5,7,-12]]
  52. print '=== map vs. list-comprehension ==='
  53. print 'map without list-comprehension:'
  54. map_without_list_comprehension()
  55. print 'map with list-comprehension:'
  56. map_with_list_comprehension()
  57. @timedtest
  58. def filter_without_list_comprehension():
  59. for i in range(10000):
  60. filter(abs, [-5,7,0,-12] )
  61. @timedtest
  62. def filter_with_list_comprehension():
  63. for i in range(10000):
  64. [i for i in [-5,7,0,-12] if i]
  65. print '=== filter vs. list-comprehension ==='
  66. print 'filter without list-comprehension:'
  67. filter_without_list_comprehension()
  68. print 'filter with list-comprehension:'
  69. filter_with_list_comprehension()</pre>
  70. <p>Et voila les résultats obtenus&nbsp;:</p>
  71. <blockquote><p>=== map vs. list-comprehension ===<br />
  72. map without list-comprehension:<br />
  73. 638 pystones<br />
  74. map with list-comprehension:<br />
  75. 534 pystones<br />
  76. === filter vs. list-comprehension ===<br />
  77. filter without list-comprehension:<br />
  78. 612 pystones<br />
  79. filter with list-comprehension:<br />
  80. 550 pystones<br /></p></blockquote>
  81. <p>Il me semble que c'est sans appel&nbsp;: les list-comprehensions sont <strong>toujours</strong> plus rapides que map ou filter avec Python 2.4. Il faudrait tester tout ça avec Python 2.5 mais je pense que les résultats seraient encore plus significatifs.</p>