2015-09-27 3 views
2

В контексте управления памятью я сталкиваюсь с множеством проблем при использовании itertools permutations специально, когда длина списка больше, чем 10.Оптимизация itertools Перестановка в Python

Есть ли лучший способ генерации перестановок для любого списка таким образом, что память мало используется?

Ниже приведен пример, как я использую его.

 num_list = [i for i in range(0,18)] 
    permutation_list = list(permutations(num_list,len(num_list))) 

    for p_tuples in permutation_list: 
      print(p_tuples) 
+2

Как вы его используете? Он не будет генерировать все перестановки сразу, если вы не попытаетесь использовать их все сразу. Если вы хотите использовать их все сразу, вы не можете избежать использования достаточного количества памяти, потому что количество перестановок велико. – BrenBarn

+0

Почему у вас есть список? Используйте их по одному. –

+0

Можете ли вы показать нам, как вы используете эту функцию? – ozgur

ответ

2

Если все, что вам нужно сделать, это перебрать перестановки, не храните их. Итерации непосредственно над объектом, возвращаемым itertools.permutations. Другими словами это сделать:

permutations = permutations(num_list,len(num_list)) 
for perm in permutations: 
    doSomethingWith(perm) 

Вызов list на итератора именно так сказать, «дать мне все элементы прямо сейчас в памяти, в то же время». Если вам не нужны или нужны все из них в памяти сразу, не используйте list. Если вы просто хотите использовать один элемент за раз, просто перейдите по тому, что вы хотите перебрать.

Обратите внимание, что ваш код по-прежнему займет много времени, если вы действительно попытаетесь пройти через все перестановки, потому что 18! это действительно большое число.

+0

Да, он все еще не работает (процесс занимает слишком много времени), но по крайней мере теперь он не бросает ошибку компиляции предела памяти. – CbK

+1

@CbK: У вас есть f * ckton результатов, поэтому, естественно, это займет много времени. –

+0

@CbK: Вы не можете ожидать, что что-то будет быстрым с 6 квадриллионами пунктов для работы. – BrenBarn

1

Перестановки возвращают генератор. Таким образом, решение - это в значительной степени то, что вы уже писали:

num_list = [i for i in range(0,18)] 

for p_tuples in permutations(num_list,len(num_list)): 
    print(p_tuples) 
Смежные вопросы