Сохранение памяти Py3k, возвращая итераторы, а не списки - PullRequest
2 голосов
/ 31 марта 2009

Многие методы, которые раньше возвращали списки в Python 2.x, теперь, похоже, возвращают итераторы в Py3k

Являются ли итераторы также генераторами выражений? Ленивая оценка?

Таким образом, благодаря этому объем памяти python резко сократится. Не так ли?

Как насчет программ, преобразованных из 2to3 с помощью встроенного скрипта?

Встроенный инструмент явно преобразовывает все возвращенные итераторы в списки для совместимости? Если это так, то преимущество Py3k в меньшей занимаемой памяти не очень заметно в преобразованных программах. Это так?

Ответы [ 3 ]

7 голосов
/ 31 марта 2009

Многие из них являются не просто итераторами, а объектами специального вида. Например, 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.

1 голос
/ 31 марта 2009

Являются ли итераторы также генераторами выражений? Ленивая оценка?

Итератор - это просто объект со следующим методом. То, что документация означает большую часть времени, когда говорит, что функция возвращает итератор, заключается в том, что ее результат загружается лениво.

Таким образом, благодаря этому объем памяти python резко сократится. Не так ли?

Это зависит. Я предполагаю, что средняя программа не заметит огромную разницу . Преимущества производительности итераторов по сравнению со списками действительно значительны только при наличии большого набора данных. Возможно, вы захотите увидеть этот вопрос .

0 голосов
/ 21 февраля 2015

Одним из самых больших преимуществ итераторов перед списками является не память, а время вычислений. Например, в Python 2:

for i in range(1000000):  # spend a bunch of time making a big list
    if i == 0:
        break  # Building the list was a waste since we only looped once

Теперь возьмем, к примеру:

for i in xrange(1000000):  # starts loop almost immediately
    if i == 0:
        break  # we did't waste time even if we break early

Несмотря на то, что пример надуманный, сценарий использования не так: петли часто разрываются на полпути. Создание всего списка для использования только его части - пустая трата времени, если вы не собираетесь использовать его более одного раза. Если это так, вы можете явно создать список: r = list(range(100)). Вот почему итераторы по умолчанию в других местах в Python 3; Вы ничего не пропустили, так как вы можете явно создавать списки (или другие контейнеры), когда вам это нужно. Но вы не обязаны делать это, когда все, что вы планируете сделать, это итерировать один раз итерацию (что, я бы сказал, гораздо более распространенный случай).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...