Это общая проблема, а не специфическая для Python. В большинстве языков, даже когда итераторы используются для использования структур, вся структура хранится в памяти. Таким образом, итераторы в основном используются как «функциональные» инструменты, а не как инструменты оптимизации памяти.
В python многие люди используют большую память из-за наличия действительно больших структур (словарей и т. Д.). Однако все переменные-объекты программы будут храниться в памяти любым способом. Единственным решением является сериализация данных (сохранение в файловой системе, база данных и т. Д.).
Итак, в вашем случае вы можете создать настраиваемую функцию, которая создаст список перестановок. Но вместо добавления каждого элемента перестановки в список он сохранил элемент либо в файле (или в базе данных с соответствующей структурой). Затем вы сможете получать по одной каждой перестановке из файла (или базы данных), не доводя весь список в памяти.
Однако, как уже упоминалось ранее, вам всегда нужно знать, в какой перестановке вы сейчас находитесь. Чтобы избежать извлечения всех созданных перестановок из базы данных (что создавало бы такое же узкое место), вы могли бы иметь индекс для каждого места, содержащего символ, используемый в ранее сгенерированной перестановке (и создавать перестановки, добавляющие символы и предопределенную последовательность) ,
Это может быть то, что вы ищете: http://stackoverflow.com/questions/976882/shuffling-a-list-of-objects-in-python? –
Он делает перестановку, но я специально хочу избежать хранения данных размера N в памяти. – Gerenuk
Плохая новость: вы не можете сделать это, не сохраняя данные: D. вам нужно знать, какой номер вы создали, если у вас нет машины для путешествий во времени: D. –