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)
[ ]: