Хорошо, это было бы немного более эффективно, и вы можете использовать генератор, подобный этому, и принимать ваши значения по мере необходимости:
def get_solution(uniques, length, constraint):
if length == 1:
for u in uniques[uniques <= constraint + 1e-8]:
yield u
else:
for u in uniques[uniques <= constraint + 1e-8]:
for s in get_solution(uniques, length - 1, constraint - u):
yield np.hstack((u, s))
g = get_solution(unique_values, 4, 1)
for _ in range(5):
print(next(g))
отпечатки
[0. 0. 0. 0.]
[0. 0. 0. 0.1]
[0. 0. 0. 0.2]
[0. 0. 0. 0.3]
[0. 0. 0. 0.4]
Сравнение с вашей функцией:
def get_solution_product(uniques, length, constraint):
return np.array([p for p in product(uniques, repeat=length) if np.sum(p) <= constraint + 1e-8])
%timeit np.vstack(list(get_solution(unique_values, 5, 1)))
346 ms ± 29.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
%timeit get_solution_product(unique_values, 5, 1)
2.94 s ± 256 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)