Теперь, когда мы говорим о производительности, я хотел бы предложить свое решение numpy с использованием bincount :
import numpy as np
interval = 3
a = [1, 7, 4, 7, 4, 8, 5, 2, 17, 8, 3, 12, 9, 6, 28]
l = max(a) // interval + 1
b = np.bincount(a, minlength=l*interval).reshape((l,interval)).sum(axis=1)
(minlength
isнеобходимо просто иметь возможность изменить форму, если max(a)
не кратен интервалу)
С метками, взятыми из ответа Эрфана, мы получаем:
rnge = range(0, max(a) + interval + 1, interval)
lables = [f'[{i}-{j})' for i, j in zip(rnge[:-1], rnge[1:])]
for l,b in zip(lables,b):
print(l,b)
[0-3) 2
[3-6) 4
[6-9) 5
[9-12) 1
[12-15) 1
[15-18) 1
[18-21) 0
[21-24) 0
[24-27) 0
[27-30) 1
Это намного быстрее, чемPandas Solution.
Сравнение производительности и масштабирования
Чтобы оценить возможности масштабирования, я просто заменил a = [1, ..., 28] * n
и рассчитал время выполнения (без импорта и печати) для n = 1, 10, 100, 1K, 10K и 100K:
![enter image description here](https://i.stack.imgur.com/2tAPp.png)
(python 3.7.3 onwin32 / pandas 0.24.2 / numpy 1.16.2)