Как разработчик Python, вы, вероятно, тратите много времени на работу с большими объемами данных. Независимо от того, обрабатываете ли вы журналы или работаете с большими наборами данных, важно убедиться, что ваш код максимально эффективен.

Один из способов повысить производительность вашего кода и уменьшить его объем памяти — использовать генераторы. Итак, что такое генераторы?

Генераторы — это особый тип функций в Python, которые позволяют генерировать значения по одному вместо того, чтобы генерировать все значения сразу. Их называют «генераторами», потому что они генерируют значения по мере необходимости на лету.

Возьмем следующий пример -

Нам нужно произвести квадраты чисел, чтобы решить определенную задачу. Найдите наиболее эффективный способ сделать это; когда памяти мало и она ограничена.

def square_it(n):
    l = []
    for i in range(n):
        l.append(i**2)

    return l

# alternate method to create a list
l = [x**2 for x in range(n)]

Вышеупомянутая функция square_it правильно выдаст необходимый результат.

# Output of square_it for n = 10
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Как мы видим, каждый элемент вычисляется и сохраняется в списке; это работает для небольших входных данных, но когда память ограничена и необходимо вычислить большие входные данные, это не самый эффективный метод.

Теперь давайте решим ту же проблему с генераторами.

def square_gen(n):
    for i in range(n):
        yield i**2

С точки зрения синтаксиса нет большой разницы между обычной функцией и функцией генератора, только ключевое слово «return» заменено на «yield». Кроме того, обратите внимание, что функция генератора возвращает объект генератора, который необходимо проанализировать, чтобы получить фактический результат.

gen = square_gen(10)

print(gen)
# output: <generator object square_gen at 0x7f2606471630>

print(next(gen))
# output: 0
print(next(gen))
# output: 1
print(next(gen))
# output: 4

Как было сказано ранее, генератор вычисляет пошагово. Чтобы получить выходные данные, мы можем использовать функцию next() для последовательного просмотра всех полученных выходных данных. Кроме того, вы можете перебрать все элементы в объекте-генераторе.

for item in gen:
    print(item)

Генератор — отличная функция, которую стоит иметь в своем арсенале. Теперь давайте подробно разберемся, как работает генератор?

Когда вызывается функция генератора, она начинает выполняться с первой строки. Когда он встречает ключевое слово yield, он возвращает значение выражения, следующего за yield, и затем приостанавливает свое выполнение. При следующем вызове генератора он возобновляет выполнение с того места, на котором остановился, и продолжает до тех пор, пока не встретит другой оператор yield.

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

Преимущества:

  1. Обработка больших наборов данных.Одним из самых больших преимуществ генераторов является то, что они позволяют эффективно работать с большими наборами данных без необходимости одновременного хранения всех данных в памяти. Это может значительно уменьшить объем памяти, занимаемой вашим кодом, и сделать его более быстрым и эффективным.
  2. Обработка журналов. Если вы обрабатываете журналы, вы можете использовать генератор для чтения и обработки каждой записи журнала по одной, вместо того чтобы читать и хранить все записи в памяти одновременно.

Советы:

Одно выражение Liner Generator:используйте круглые скобки (), чтобы изменить список [] на объект-генератор.

gen = (x**2 for x in range(10))
# same square func in one liner

продолжайте учиться, продолжайте кодить!