На моей машине ваш код с timeit
занял 151 микросекунду.Следующее заняло 11 микросекунд:
import numpy as np
nitems = 100
ncells = 3
values = np.random.randint(0,ncells,nitems)
cells = np.array_split(values,3)
lengths= [ len(cell) for cell in cells ]
print(lengths,np.sum(lengths))
Результат печати: [34, 33, 33] 100
.
Магия здесь заключается в использовании numpy
для выполнения расщепления, но обратите внимание, что этот метод будетразделить как можно ближе к форме.
Если вы хотите, чтобы разбиение выполнялось случайным образом:
import numpy as np
nitems = 100
ncells = 3
values = np.random.randint(0,ncells,nitems)
ind_split = [ np.random.randint(0,nitems) ]
ind_split.append(np.random.randint(ind_split[-1],nitems))
cells = np.array_split(values,ind_split)
lengths= [ len(cell) for cell in cells ]
print(lengths,np.sum(lengths))
Это использует преимущество numpy.array_split
, взяв в качестве аргумента индексы того, где выполнять разбиение (а не количество почти равномерныхперегородки).