Почему и как я использую генераторы в 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.
В заключение
Рассмотрите возможность использования генераторов при работе с потенциально большими последовательными данными. Генераторы эффективны при работе с большим последовательным потоком данных, поэтому мы можем использовать их в качестве строительных блоков функций, помогающих разработать лучшую структуру.