www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Выражения генератора Python: вставка больших наборов данных в память

Дата публикации Aug 20, 2018

Не забывайте оставаться увлажненным, пока вы пишете код. Источник:Pixabay

Выражения генератора - это интересная функция в Python, которая позволяет нам создавать лениво генерируемые итерируемые объекты. Если ваши данные не помещаются в памяти, они могут быть решением.

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

Что такое выражения генератора?

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

Интересная особенность, которая поставляется с генераторами, заключается в том, что они генерируют свой Iterable Object ленивым способом:я-ый элемент в вашем Iterable не будет создан (и, следовательно, не будет занимать драгоценную виртуальную память), пока он не будет необходим. В качестве улова вы не можете индексировать или разрезать Generator, как если бы вы использовали List - вместо того, чтобы извлекать произвольные элементы из Iterable, вы можете повторять его только по порядку. Это также причина, почему вы не можете позвонитьLenфункция на генераторе.

Преимущество использования генераторов: простой эксперимент

Чтобы доказать, почему генераторы могут быть полезны, я провел следующий эксперимент:

Как видите, генератор хранит «ту же самую» информацию, используя только 80 байтов, тогда как список занимает более 80 Мб. Генератор также загружается намного быстрее, хотя мы говорим о паре секунд здесь. Тогда становится ясно, что при любой проблеме, когда памяти может быть недостаточно, замена списков на генераторы может быть разумным выбором, если мы помним вышеупомянутые предостережения (нет произвольного поиска, нетLenпроверка).

Генераторы как итераторы

Тем, кто пришел из Java / C ++ фона, может быть интересно знать, что Generator может использоваться с интерфейсом, похожим на Iterator. Это делается с помощьюследующийметод в Python 2, иследующийфункция в Python 3+. Вот пример того, как мы будем использовать Generator в Python 2.7:

Обычно мы просто повторяем его, как и любой другой Iterable: используядля цикла.Однако, учитывая нетривиальные условия для конца цикла или для его продолжения, мы можем оказаться в ситуации, когда мы хотели бы повторить его вручную. Для этого мы просто позвонимследующийметод (Python 2) или функция (Python 3), пока он не выбрасываетStopIterationисключение. Обратите внимание, что время, затрачиваемое на генерацию каждого элемента по отдельности при извлечении, в итоге будет складываться, что займет столько же времени, сколько потребуется для инициализации всего списка без ленивости. Наконец, с помощью Generator мы всегда можем преобразовать его в простой старый список, не ленивый,Список (our_generator),оплачивая всю стоимость инициализации,

Обычное использование генераторов, которые вы, возможно, пропустили

Один из моих удивительных читателей представил другой способ использования генераторов. Вы, вероятно, знакомы с тем, как мы открываем файл и перебираем его строки в Python:

Этот фрагмент фактически загружает файл лениво, построчно, используя Generator. Там у вас есть, мы использовали генераторывсе это время!Как насчет этого для следующего фильма Shyamalan.

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

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

Наконец, есть книга О'Рейли, которую я люблю, и я нашел ее очень полезной, когда начал свое путешествие по науке о данных. Это называетсяНаука о данных с нуля с Pythonи это, вероятно, половина причины, по которой я получил свою работу. Если вы читаете это далеко, вы можете наслаждаться этим!

P. S: Пожалуйста, подумайте о том, чтобы следовать за мной для получения дополнительных советов и рекомендаций по Python или статей по науке о данных. Если вы нашли эту статью полезной, пожалуйста,поддержать мое письмо,

Как всегда, продолжайте кодировать!

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map