Выражение генератор в Python. Часть 2
В прошлой статье мы рассмотрели основные особенности выражения генератора в Python, и его отличия от генератора списков. Основное преимущество данного элемента в языке Python, является способ которым он использует память компьютера. Так функция next() является своего рода точкой выхода данных. Каждый вызов функции выводит одну порцию информации, после чего запоминает текущую позицию вызванного элемента. Таким образом память компьютера в каждый момент будет заполнена лишь некоторой частью из большого массива данных. В самой конструкции она скрыта от глаз пользователя. Проиллюстрируем данную особенность выражения генератора на примере вычисления суммы цифр из некоторого промежутка:
# создадим список
v = list(range(99999999))
# вывод
MemoryError
# происходит переполнение памяти в Python
# то же самое и с генератором списка
b = [i**2 for i in range(99999999)]
# создадим **выражение генератор**
b = (i**2 for i in range(99999999))
print(sum(b))
# вывод
333333183333354999999
# для итерации по элемента необходимо создать новый генератор так как возможность итерации исчерпана в предыду-
# щем примере
b = (i**2 for i in range(9999999))
for x in b:
print(x)
Выражения генераторы способны оптимизировать использование памяти в вашей программе, улучшая ее. Перейдем к следующему примеру:
# создадим список с названиями некоторых сайтов и уберем знаки **протокола https**, отбросив домен **"net"**.
b = ['https://www.example1.com','https://www.example2.net',
'https://www.example3.com','https://www.example4.com',
'https://www.example5.com','https://www.example6.net']
z = (x.split('//')[1] for x in b if '.com' in x)
for i in z:
print(i)
# вывод
www.example1.com
www.example3.com
www.example5.com
www.example4.com
Для более наглядного представления преимуществ выражения генератора создадим список из элементов нашего диска D:
import os # импортируем модуль для работы в операционной системе
l = [x for x in os.walk('D:\\')] # генерируем список
l.__sizeof__()
#вывод
257272
s = (x for x in os.walk('D:\\')) # выражение генератор
s.__sizeof__()
# вывод
32
При запуске первой строчки кода видно, как долго происходит его выполнение, при этом выражение генератор выполняется почти мгновенно. И как видно дальше его относительный вес в памяти компьютера равен всего 32.
-
- Михаил Русаков
Комментарии (0):
Для добавления комментариев надо войти в систему.
Если Вы ещё не зарегистрированы на сайте, то сначала зарегистрируйтесь.