Вы можете использовать itertools.islice
в генераторе itertools.permutations(perm)
вместо сохранения всей последовательности в памяти:
next(itertools.islice(itertools.permutations(perm), (10**6)-1, None))
Это возвращает:
('q', 'w', 'e', 'r', 't', 'y', 'u', 'i', 'o', 'p', 'a', 's', 'd', 'f', 'g', 'h', 'l', 'b', 'n', 'z', 'm', 'k', 'c', 'x', 'v', 'j')