Производительность генератора Python и итератора [Complete Guide]

Генераторы и итераторы Python используются для перебора набора элементов. Хотя они оба служат одной и той же цели, они работают по-разному и имеют разные последствия для производительности. В этом руководстве мы рассмотрим, что такое генераторы и итераторы, как их создать и проанализируем их производительность.
Генератор Python против итератора
Итераторы
- Итератор — это объект, реализующий протокол итератора, состоящий из методов итер() и следующий().
- Итераторы допускают ленивую оценку, что означает, что следующее значение в последовательности вычисляется по требованию.
- Они используются для обхода контейнеров, таких как списки, кортежи и т. д.
Генераторы
- Генераторы — это простой способ создания итераторов.
- Они также допускают ленивые вычисления, но используют функцию с оператором yield вместо реализации оператора yield. итер() и следующий() методы.
- Генераторы автоматически поддерживают состояние между последовательными вызовами.
Генераторы Python
Как создать генератор
Вы можете создать генератор, определив функцию и используя ключевое слово yield в Python.
def count_up_to(max):
count = 1
while count <= max:
yield count
count += 1
# Using the generator
for number in count_up_to(5):
print(number)
Вы можете увидеть вывод, как показано ниже:

Анализ производительности
Генераторы Python эффективно используют память. Они не хранят все значения в памяти; они генерируют каждое значение на лету.
import sys
# List comprehension uses a lot of memory
numbers_list = [x for x in range(1000000)]
print("Size of the list:", sys.getsizeof(numbers_list), "bytes")
# Generator expression uses less memory
numbers_generator = (x for x in range(1000000))
print("Size of the generator:", sys.getsizeof(numbers_generator), "bytes")
Итераторы Python
Как создать итератор
Чтобы создать итератор, вам нужно реализовать итер и следующий методы в Python.
class CountUpTo:
def __init__(self, max):
self.max = max
self.count = 0
def __iter__(self):
return self
def __next__(self):
if self.count > self.max:
raise StopIteration
self.count += 1
return self.count - 1
# Using the iterator
counter = CountUpTo(5)
for number in counter:
print(number)
Анализ производительности
Итераторы Python также не хранят все значения в памяти, а генерируют их на лету. Однако создание итератора требует определения класса, который может быть более подробным, чем генераторы.
import sys
# Iterator
class RangeSquared:
def __init__(self, n):
self.n = n
self.i = 0
def __iter__(self):
return self
def __next__(self):
if self.i >= self.n:
raise StopIteration
else:
result = self.i ** 2
self.i += 1
return result
# Memory consumption
numbers_iterator = RangeSquared(1000000)
print("Size of the iterator:", sys.getsizeof(numbers_iterator), "bytes")
Генераторы и итераторы: отличия
Атрибут | Генератор | Итератор |
---|---|---|
Создание | Функция с yield ключевое слово |
Класс с __iter__ & __next__ |
Потребление памяти | Низкий (генерирует на лету) | Низкий (генерирует на лету) |
Многословие кода | Менее подробный | Подробнее |
Использование состояния | Автоматическое сохранение состояния между выходами | Необходимо управлять состоянием вручную |
Использование ленивой оценки | Да | Да |
Вариант использования | Простая и экономичная итерация | Индивидуальный контроль итераций |
Заключение
Когда вам нужно перебрать последовательность данных, не загружая все данные в память, полезны как генераторы, так и итераторы. Генераторы проще написать, и они должны быть вашим выбором для большинства случаев использования. Однако, если вам нужен больший контроль над процессом итерации, лучшим вариантом может быть реализация пользовательского итератора.
Я надеюсь, вы получили представление о Производительность генератора Python и итератора.
Вам также может понравиться:

Я Биджай Кумар, Microsoft MVP в SharePoint. Помимо SharePoint, последние 5 лет я начал работать над Python, машинным обучением и искусственным интеллектом. За это время я приобрел опыт работы с различными библиотеками Python, такими как Tkinter, Pandas, NumPy, Turtle, Django, Matplotlib, Tensorflow, Scipy, Scikit-Learn и т. д. для различных клиентов в США, Канаде, Великобритании, Австралии, Новая Зеландия и т. д. Проверьте мой профиль.
Ссылка на источник