Я верю, что это будет лучшее, что вы можете сделать. Генерация количества перестановок списка генерирует n! Перестановки. Поскольку вам нужно сгенерировать их все это также, сколько времени это займет (O (n!)). То, что вы можете попытаться сделать, это сделать функцию генератора Python, так что вы всегда будете генерировать ровно столько, сколько вам нужно, вместо того, чтобы предварительно вычислять их все и хранить в памяти. Если вы хотите пример этого, я мог бы дать вам один.
Извините, это может быть весьма отрицательный ответ. Это хороший вопрос, но я уверен, что это самое лучшее, что вы можете сделать, асимптотически. Вы могли бы немного оптимизировать сам код, чтобы использовать меньше инструкций, но в итоге это не сильно поможет.
Edit:
Это реализация Python алгоритма Heap, который я обещал
(https://en.wikipedia.org/wiki/Heap%27s_algorithm) генерирует N! Перестановок, где генерация каждой перестановки занимает амортизированное O (1) время и использует O (n) пространственную сложность (по альтернативам
def permute(lst, k=None):
if k == None:
k = len(lst)
if k == 1:
yield lst
else:
yield from permute(lst, k-1)
for i in range(k-1):
if i % 2 == 0:
#even
lst[i], lst[k-1] = lst[k-1], lst[i]
else:
#odd
lst[0], lst[k-1] = lst[k-1], lst[0]
yield from permute(lst, k-1)
for i in permute([1, 2, 3, 4]):
print(i)