Histogramme et dictionnaire

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.

[1]:
import random

num = [random.randint(0, 10) for i in range(1000)]
[2]:
hist = {}
for i in num:
    hist[i] = hist.get(i, 0) + 1
[3]:
hist
[3]:
{9: 95, 5: 88, 7: 91, 4: 97, 3: 93, 8: 92, 1: 90, 0: 85, 6: 86, 10: 85, 2: 98}

Mesurer le temps que cela prend :

[4]:
def count1(num):
    hist = {}
    for i in num:
        hist[i] = hist.get(i, 0) + 1
    return hist


%timeit count1(num)
152 µs ± 12.3 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

Comparons avec une autre implémentation :

[5]:
def count2(num):
    hist = {}
    for i in num:
        if i in hist:
            hist[i] += 1
        else:
            hist[i] = 1
    return hist


%timeit count2(num)
170 µs ± 14.1 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

Une version plus rapide :

[6]:
from collections import Counter


def count3(num):
    return Counter(num)


%timeit count3(num)
57.8 µs ± 4.61 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)

Une dernière avec cytoolz :

[7]:
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)
110 µs ± 15.9 µs per loop (mean ± std. dev. of 7 runs, 10,000 loops each)
[ ]:


Notebook on github