Почему и как я использую генераторы в python

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

ПОЧЕМУ я их использую

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

Перечислите типичную структуру данных общего назначения в Python. Я часто использую список, но это не лучший выбор для изменчивого размера данных. Например, список может содержать 5, 100, 10 000 или 5 00 000 элементов или даже больше.


def scale_to_log10(till_number):

 log10_number_seq = []

 for num in range(1, till_number):

     log10_number_seq.append(math.log10(num))

 return log10_number_seq

Приведенный выше код просто хорош и даст ожидаемый результат, если вообще 😃.

Если аргумент ’till_number’, переданный в функцию диапазона, имеет высокое значение. Это может привести к созданию списка в памяти, то есть путем загрузки в него данных. И если вашей программе посчастливится работать в вечном пространстве памяти, то все будет хорошо. А теперь представьте, размер списка, сгенерированного диапазоном функций, составляет 4 ГБ, а размер памяти — 2 ГБ, ой. Это сделает процесс вялым и может привести к сбою с ошибкой нехватки памяти, и они решат, что вы плохой разработчик. 😕.

Как хороший, если не великий разработчик, мы должны убедиться, что функция, которую мы пишем, работает должным образом, не злоупотребляя физическими ресурсами, такими как оперативная память (ОЗУ) и центральный процессор (ЦП).

КАК я их использую

Чтобы избежать наихудшего сценария сбоя процесса и перегрузки памяти, которую могут использовать другие процессы, я использую генераторы.

Вот фрагмент.

Для Python2:


def scale_to_log10(till_number):

    for num in xrange(1, till_number):

        yield math.log10(num)

Для Python3:


def scale_to_log10(till_number):

    for num in range(1, till_number):

        yield math.log10(num)

Обратите внимание, что range функция генератора в python3 похожа на range в питоне2.

Разница между двумя методами очевидна. Метод выполняет генератор, использует оператор yield вместо оператора return и далее использует функцию xrange вместо функции диапазона. Это случай ленивой загрузки или ленивой обработки. Он сохраняет в памяти только элемент обработки, а не полный список.

В python3 функция диапазона такая же, как функция xrange в python2. это означает, что он возвращает объект генератора в python3 и список в python2.

В заключение

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

Похожие записи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *