Многие из них являются не просто итераторами, а объектами специального вида. Например, range () теперь возвращает что-то похожее на старый объект xrange - он все еще может быть проиндексирован, но лениво создает целые числа по мере необходимости.
Аналогичным образом dict.keys () дает объект dict_keys, реализующий представление на dict, а не создающий новый список с копией ключей.
Как это влияет на следы памяти, вероятно, зависит от программы. Конечно, больше внимания уделяется использованию итераторов, если только вам действительно не нужны списки, тогда как использование списков обычно использовалось по умолчанию в python2. Это приведет к тому, что средняя программа, вероятно, будет более эффективно использовать память. Случаи, когда есть действительно большая экономия, вероятно, уже будут реализованы как итераторы в программах на python2, так как действительно большое использование памяти будет выделяться, и, скорее всего, уже решено. (например, файловый итератор уже намного эффективнее использует память, чем старый file.readlines()
метод)
Преобразование выполняется с помощью инструмента 2to3 и обычно преобразует такие вещи, как range (), в итераторы, где он может безопасно определить, что реальный список не нужен, поэтому код вроде:
for x in range(10): print x
переключится на новый объект range (), больше не создавая список, и, таким образом, получит уменьшенное преимущество памяти, но код, подобный:
x = range(20)
будет преобразовано в:
x = list(range(20))
, поскольку преобразователь не может знать, ожидает ли код вещественный объект списка в x.