www.machinelearningmastery.ru

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

Home

Понимание списка Python: использование и преимущества

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

Глаза переводчика, весы надежного кода. Источник:Pixabay

Независимо от того, являетесь ли вы Data Scientist, веб-разработчиком, работающим с API, или любым другим из длинного списка ролей, есть вероятность, что в какой-то момент вы наткнетесь на Python.

Некоторые из нас любят его за его простоту, его текучесть и разборчивость. Другие ненавидят его за то, что он не так эффективен, как C или чистая сборка, имеет Duck Typing или однопоточен (ish).

Независимо от того, к какой группе вы принадлежите, если вы находитесь в положении, в котором вы хотите / должны писать код Python, вам нужно, чтобы он был как можно более разборчивым. Или вы, возможно, натолкнулись на понимание списка в дикой природе и не понимаете, как его приручить. Если что-то из этого является правдой, то эта статья для вас.

Что такое списочное понимание?

Прежде всего, давайте определимся с нашими условиями. Понимание списка - это кусочек синтаксического сахара, который заменяет следующий шаблон:

С этим, эквивалентно, один:

Почему мы должны их использовать

Каковы преимущества использования списочных представлений? Прежде всего, вы сводите 3 строки кода в одну, которая будет мгновенно узнаваема для любого, кто понимает понимание списка. Во-вторых, второй код работает быстрее, поскольку Python сначала выделяет память списка, прежде чем добавлять в него элементы, вместо того, чтобы изменять размер во время выполнения. Это также позволит избежать необходимости звонить, чтобы «добавить», который может быть дешевым, но сложным. Наконец, код, использующий понимание, считается более «Pythonic» - лучше подходящим для стиля Python.

Рефакторинг кодовых запахов

Другое, более тонкое преимущество - обнаружение запаха. Ваш код без понимания может выглядеть так:

Если предыдущий или следующий код достаточно длинный в ‘some_function», Этот бит в списке может потеряться. Но использование списочных пониманий непосредственно в этих 6 строках выглядит не очень красиво:

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

рефакторинг с двумя уровнями абстракции

Затем эти первые шесть строк кода в конечном итоге просто

another_list = [new_function(i) for i in range(k)]

Что гораздо понятнее (если бы я не выбрал такие ужасные названия для наших функций) и читается быстрее, если вы знаете, что происходит. Некоторые могут возразить, что в итоге я добавил 6 строк служебного кода, чтобы добраться до этого места. Это правда, но если такое поведение появилось хотя бы еще раз в коде, то даже это на самом деле не потеря. И даже если бы это было не так, то, что мы теряем в размере кода, мы получаем в обслуживании и удобочитаемости, которые следует искать.

Хорошие программисты пишут код, понятный людям.

Мартин Фаулер

Некоторые другие вещи, которые легко сделать со списком

разворачивание матрицы в вектор:

vector_version = [1,0,0,0,1,0,0,0,1]

Фильтрация списка:

Генерация множества экземпляров класса (в данном случае моделируется с помощью простого словаря, такого как объект JSON):

Преобразование списка объектов определенного типа в список другого типа:

Мы генерируем список первых 100 чисел, превращенных в строки, или просто строку, соединяющую их запятыми. Все в одну плавную линию!

Повышение производительности

Чтобы убедиться в существенном повышении производительности, я решил провести несколько тестов. Я запустил версию цикла for и версию со списком того же кода, с фильтрацией и без нее. Вот фрагмент теста:

list_aМетоды генерируют списки обычным способом, с циклом for и добавлением.list_bметоды используют списки.

Мои результаты были следующими:

  • 5,84 секунды для списка
  • 4,07 секунды для списка b
  • 4,85 секунды для отфильтрованного списка
  • 4,13 секунды для отфильтрованного списка б

Я призываю вас запустить этот же скрипт на вашем компьютере и убедиться в этом, возможно, даже изменить размер ввода.

Мы видим увеличение скорости на 33% от перехода к списочным представлениям в нефильтрованном случае, тогда как отфильтрованный алгоритм получает только 15%. Это подтверждает нашу теорию о том, что главное преимущество в производительности заключается в отсутствии необходимостиAppendметод на каждой итерации, который пропускается на каждой другой итерации в отфильтрованном случае.

Наконец, я должен добавить, что все, что я только что рассказал вам о списках, можно сделать с помощью словарей Python.

Словарь понятий:

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

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

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

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

Footer decor

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