Мне не нравится ответ, данный передо мной с использованием product
, так как, глядя на его реализацию в документации по python, кажется, что все это заносится в список в памяти, прежде чем начать давать результаты.
Это очень плохо для вашего случая, поскольку, как сказал сам Агф, число перестановок здесь огромно (более миллиона). Для этого случая был создан оператор yield
, чтобы огромные списки могли генерироваться динамически, а не охватываться в памяти (я также не любил расточительный range
, где xrange
совершенно применимо).
Я бы пошел к решению, как это:
def generate(chars, length, prefix = None):
if length < 1:
return
if not prefix:
prefix = ''
for char in chars:
permutation = prefix + char
if length == 1:
yield permutation
else:
for sub_permutation in generate(chars, length - 1, prefix = permutation):
yield sub_permutation
Таким образом, все, что охватывает память, представляет собой рекурсивный стек «n» в глубине, где «n» - это длина ваших перестановок (в данном случае 4), и каждый раз возвращается только один элемент.
chars - набор символов для выбора, длина - 4, и использование довольно похоже на продукты, за исключением того, что оно не охватывает весь список в памяти во время выполнения.