2017-01-28 5 views
0

Будучи новичком в программировании, я играл с Python с помощью этого сценария:64 бит Python причины замораживать

import itertools 
Lists=list(itertools.permutations(['a','b','c','d','e','f','g','h','i','j','k'])) 
print(len(Lists)) 

На 32-битной Python это вызовет ошибку переполнения памяти. Однако, пытаясь на 64-битном Python и наблюдая за Диспетчером задач, Python использует 4 ГБ памяти (у меня 8 ГБ ОЗУ), тогда мой компьютер зависает, и я должен перезапустить его.

Это нормальное поведение? Как я могу исправить это или ограничить доступ к памяти Python?

Также, если бы я преобразовал что-то подобное в .exe-файл (использовал этот скрипт для тестирования чего-то еще), он бы заморозил другие компьютеры?

ответ

2

Функция itertools.permutations() возвращает генератор, который лениво вычисляет все возможные перестановки данной последовательности в лексикографическом порядке. Затем ваш код сохраняет все эти перестановки явно в list.

Ваша последовательность содержит 11 букв. Для вашего входа 11! = 39 916 800 перестановок. Python не особенно эффективен с точки зрения памяти; для каждой из 40 миллионов перестановок эти значения необходимо сохранить:

  • Указатель на объект списка. (8 байтов на 64-битном Python)
  • Сам контейнер списка, содержащий 11 указателей на строки и провисание. (8 × 8 байт)

Таким образом, для каждой перестановки используется не менее 96 байт. Добавляя некоторые дополнения и разные отходы, мы можем оценить, что каждая перестановка использует 150 байт памяти. Умножьте это на 40 миллионов, и мы получим 6 гигабайт.


Это высокое потребление памяти объясняет, почему ваша программа умирает на 32-битном Python (не может использовать более 4 ГБ оперативной памяти, так и на практике ограничена 2 Гб). Кроме того, когда процесс потребляет много памяти, он может вызвать обморок в файле страницы/swap, если он включен.

Один из способов ограничить ограничение памяти Python осуществляется через механизмы, предоставляемые через операционную систему, такие как ulimit. Другой способ - обратиться к resource module.

+0

Благодарю вас, ваш ответ имеет большой смысл. Не следует ли сначала называть python ошибку переполнения, а не замораживать мой компьютер? Как и вышеприведенный парень, хотя он действительно не ответил на многое из того, что было задано: P спасибо в любом случае – NightShade

+1

На Python 3.5 я получаю использование памяти в размере 5.786255888 ГБ с использованием 'getsizeof (permutations) + sum (getsizeof (p) for p в перестановках) ' –

+0

Спасибо за предложения, я использую Windows 10, поэтому не могу использовать 'ulimit', и когда я пытаюсь импортировать ресурс, я получаю модуль не найденной ошибкой -« Нет модуля с именем «resource». » Возможно, я должен предотвратить создание массивов определенного размера с помощью этой функции? – NightShade