.. _histogrammerapiderst: ================================== 1A.1 - Histogramme et dictionnaire ================================== .. only:: html **Links:** :download:`notebook `, :downloadlink:`html `, :download:`python `, :downloadlink:`slides `, :githublink:`GitHub|_doc/notebooks/1a/histogramme_rapide.ipynb|*` Compter les occurences de nombres dans une liste est assez facile avec un dictionnaire et on peut l’écrire de plusieurs manières différentes. .. code:: ipython3 import random num = [random.randint(0,10) for i in range(1000)] .. code:: ipython3 hist = {} for i in num: hist[i] = hist.get(i, 0) + 1 .. code:: ipython3 hist .. parsed-literal:: {0: 81, 1: 90, 2: 104, 3: 85, 4: 87, 5: 85, 6: 114, 7: 87, 8: 87, 9: 96, 10: 84} Mesurer le temps que cela prend : .. code:: ipython3 def count1(num): hist = {} for i in num: hist[i] = hist.get(i, 0) + 1 return hist %timeit count1(num) .. parsed-literal:: 195 µs ± 44.9 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each) Comparons avec une autre implémentation : .. code:: ipython3 def count2(num): hist = {} for i in num: if i in hist: hist[i] += 1 else: hist[i] = 1 return hist %timeit count2(num) .. parsed-literal:: 102 µs ± 6.24 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) Une version plus rapide : .. code:: ipython3 from collections import Counter def count3(num): return Counter(num) %timeit count3(num) .. parsed-literal:: 44.4 µs ± 3.86 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each) Une dernière avec `cytoolz `__ : .. code:: ipython3 from cytoolz import count, groupby import cytoolz def count4(num): return list(cytoolz.map(lambda x: (x[0], count(x[1])), groupby(lambda x:x, num).items())) %timeit count4(num) .. parsed-literal:: 106 µs ± 3.23 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)