Как разработчик 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
, чтобы указать, что больше не нужно генерировать значений.
Преимущества:
- Обработка больших наборов данных.Одним из самых больших преимуществ генераторов является то, что они позволяют эффективно работать с большими наборами данных без необходимости одновременного хранения всех данных в памяти. Это может значительно уменьшить объем памяти, занимаемой вашим кодом, и сделать его более быстрым и эффективным.
- Обработка журналов. Если вы обрабатываете журналы, вы можете использовать генератор для чтения и обработки каждой записи журнала по одной, вместо того чтобы читать и хранить все записи в памяти одновременно.
Советы:
Одно выражение Liner Generator:используйте круглые скобки (), чтобы изменить список [] на объект-генератор.
gen = (x**2 for x in range(10)) # same square func in one liner
продолжайте учиться, продолжайте кодить!