Как я могу избежать memory error при генерации большого количества вариантов с помощью itertools.permutations
У меня есть 2 функции, которые используют itertools.permutations. Как я могу решить memory error при создании массива с длиной хотя бы в 6 символов (если меньше, то все работает без проблем)
def generate_permutations(length):
numbers = list(range(10))
permutations = list(set(i for i in itertools.permutations(numbers, length)))
return permutations
def get_all_variants(string: str) -> list[str]:
def is_not_start_with_digit(item):
return not item[0].isdigit()
return sorted(filter(is_not_start_with_digit, list(set([''.join(p) for p in permutations(string)]))))
Ответы (1 шт):
Автор решения: Alex Titov
→ Ссылка
Кажется, Вы зря формируете на промежуточных этапах множества и списки. Вот код, который на достаточно хилой машине "задумывается" секунд на 30 только на последнем шаге (11 символов, 21772800 вариантов). До memory error дожидаться было лень :) Надеюсь, я правильно понял задачу.
import itertools
def get_all_variants(string: str):
return (''.join(p) for p in itertools.permutations(string)
if not p[0].isdigit())
for i in range(2, 12):
q = sorted(get_all_variants('a1b2c3d4e5f6g7'[:i]))
n = len(q)
print(i, ":", n)
if n < 100:
print(q)
UPD. set в задаче, вероятно, нужен, но добавление в функции return set( практически не замедлило