Python

Производительность генератора 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 и итератора

Анализ производительности

Генераторы 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 и итератора.

Вам также может понравиться:


Ссылка на источник

Похожие статьи

Кнопка «Наверх»