Рубрики
Без рубрики

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

Фото Дэвида Карбони (https://unsplash.com/photos/xvkSnspiETA) на Unsplash (https://unsplash.com) Генераторы-это очень мощная функция в python, которая помогает вам писать более качественный и организованный код. ПОЧЕМУ?…

Автор оригинала: feroz khan.

Фото от Expect Best from Pixels

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

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

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

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

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’, переданный в функцию range, является высоким. Это может привести к тому, что он создаст список в памяти, то есть загрузит в него данные. И если вашей программе посчастливится работать в вечном пространстве памяти, то все будет хорошо. Теперь представьте себе, что размер списка, генерируемого диапазоном функций, составляет 4 ГБ, а доступный объем памяти-2 ГБ, ой. Это сделает процесс вялым и может привести к сбою с outofmemoryerror, и они будут считать, что вы не очень хороший разработчик .

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

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

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

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

Для 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)

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

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

в заключение

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