Список создается на каждой итерации python 'для' l oop? - PullRequest
0 голосов
/ 12 марта 2020

Я хочу знать, если список , созданный (созданный) и использованный в для l oop, снизит эффективность моей программы.

Например:

for i in range(1, 10000):
     print("This i = ", i)

Скажите, пожалуйста, если список [1,2,3, ..., 10000] (что составляет диапазон (1, 10000) ) будет генерироваться (или создаваться) на каждой итерации или нет. Потому что, если да, то это огромные накладные расходы и неэффективная программа.

На самом деле я хочу использовать это так:

with open("bbc.txt", 'w', encoding='utf-8') as bbcFile:
    for headline in BS(REQ.get("https://www.bbc.com").text, 'html.parser').find_all('div', {'class':'media__content'}):
        bbcFile.write(" ".join(headline.text.split()) + "\n\n")

Ответы [ 2 ]

2 голосов
/ 12 марта 2020

В Python для выписки, в соответствии с документами :

for_stmt ::=  "for" target_list "in" expression_list ":" suite
              ["else" ":" suite]

В соответствии с вышеупомянутыми документами,

The список выражений вычисляется один раз ; это должно привести к повторяемому объекту. Итератор создан для результата expression_list. Затем набор выполняется один раз для каждого элемента, предоставленного итератором, в порядке, возвращаемом итератором. Каждый элемент, в свою очередь, присваивается target list с использованием стандартных правил для назначений (см. Инструкции присваивания), а затем выполняется suite.

Так что нет, какое бы выражение вы ни использовали в производить итерацию оценивается только один раз. Вы можете проверить это сами:

>>> class MyIterable:
...     def __init__(self):
...         print("Initialized")
...     def __iter__(self):
...         yield from (1,2,3)
...
>>> for x in MyIterable():
...     print(x)
...
Initialized
1
2
3
>>>
1 голос
/ 12 марта 2020

Для Python 3, нет. range(1, 10000) создает объект диапазона, который при необходимости создает элементы:

>>> range(1, 10000)
range(1, 10000)
>>> type(range(1, 10000))
<class 'range'>

Таким образом, в памяти никогда не будет списка [1, ..., 10000].

Хороший вопрос SO, который стоит проверить этот , который объясняет range объект.

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