Крутые модули Python, которые вы не используете, а надо бы

МЕНЮ


Искусственный интеллект
Поиск
Регистрация на сайте
Помощь проекту

ТЕМЫ


Новости ИИРазработка ИИВнедрение ИИРабота разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика

Авторизация



RSS


RSS новости


2019-12-26 18:52

разработка по

Какие методы и модули Python сделают ваш код чище и эффективнее? Рассмотрим 5 скрытых жемчужин стандартной библиотеки Python.

Крутые модули Python, которые вы не используете, а надо бы

Язык Python – прекрасен, и содержит много встроенных модулей, которые помогают сделать код более качественным и красивым.

Задача

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

NamedTuple

Полагаем, некоторые из вас уже знакомы с более популярным именованным кортежем namedtuple из модуля collections (если нет – ознакомьтесь). Но начиная с Python 3.6, в модуле typing доступен новый класс: NamedTuple. Оба предназначены для быстрого создания читаемых неизменяемых объектов.

NamedTuple – на самом деле типизированная версия namedtuple и, по мнению разработчика, этот класс гораздо более читаемый:

In [2]: import typing                                                                                                                                                                                                   In [3]: class BetterLookingArticle(typing.NamedTuple):      ...:     title: str      ...:     id: int      ...:     description: str = "No description given."      ...:                                                                                                                                                                                                                 In [4]: BetterLookingArticle(title="Python is cool.", id=1)                                                                                                                                                    BetterLookingArticle(title='Python is cool.', id=1, description='No description given.')

Вот альтернатива c использованием namedtuple:

In [6]: import collections                                                                                                                                                                                              In [7]: Article = collections.namedtuple("Article", ["title", "description", "id"])                                                                                                                                     In [8]: Article(title="Python is cool.", id=1, description="")                                                                                                                                                 Article(title='Python is cool.', description='', id=1)

array.array

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

Когда используется модуль array, создание массива происходит с указанием типа данных, который будут использовать все его элементы. Давайте сравним время выполнения кода с обычным списком, записав много целых чисел в файл (используя модуль pickle для обычного списка):

Крутые модули Python, которые вы не используете, а надо бы
https://gist.github.com/AdamGold/961758c66cdfe92642eabb61d9ce9866

В 14 раз быстрее. Это много. Конечно, время выполнения также зависит и от модуля pickle, но всё же массив гораздо компактнее, чем список. Поэтому, если используете простые числовые значения, рассматривайте использование модуля array.

itertools.combinations

itertools – впечатляющий модуль. У него так много разных методов, позволяющих экономить время. Есть даже репозиторий GitHub, содержащий ещё больше подобных инструментов.

Давайте посмотрим на метод combinations. Он принимает в качестве аргументов итерируемый объект и целое число. В результате получаем генератор, состоящий из всех возможных комбинаций итерируемого объекта. Максимальная длина последовательности равна указанному целому числу. Сочетания не дублируются:

In [16]: import itertools                                                                                                                                                                                             In [17]: list(itertools.combinations([1, 2, 3, 4], 2))                                                                                                                                                         [(1, 2), (1, 3), (1, 4), (2, 3), (2, 4), (3, 4)]

dict.fromkeys

Быстрый и красивый способ создания словаря со значениями по умолчанию:

In [18]: dict.fromkeys(["key1", "key2", "key3"], "DEFAULT_VALUE")                                                                                                                                              {'key1': 'DEFAULT_VALUE', 'key2': 'DEFAULT_VALUE', 'key3': 'DEFAULT_VALUE'}

Последний, но не менее важный – модуль dis

Модуль dis обеспечивает анализ байт-кода CPython путём его дизассемблирования.

Как вы наверняка знаете, Python компилирует исходный код в набор инструкций под названием «байт-код». Модуль dis помогает обрабатывать эти инструкции. И это отличный инструмент для отладки.

Вот пример из книги «Fluent Python»:

In [22]: t = (1, 2, [3, 4])                                                                                                                                                                                           In [23]: t[2] += [30, 40]                                                                                                                                                                                             ---------------------------------------------------------------------------  TypeError                                 Traceback (most recent call last)  <ipython-input-25-af836a8d44a2> in <module>  ----> 1 t[2] += [30, 40]    TypeError: 'tuple' object does not support item assignment    In [24]: t                                                                                                                                                                                                            Out[24]: (1, 2, [3, 4, 30, 40])

Получили ошибку, но операция всё равно завершилась. Как так? Узнаем, если посмотрим на байт-код (добавлены комментарии рядом с важными частями):

In [25]: dis.dis("t[a] += b")                                                                                                                                                                                           1           0 LOAD_NAME                0 (t)                2 LOAD_NAME                1 (a)                4 DUP_TOP_TWO                6 BINARY_SUBSCR                8 LOAD_NAME                2 (b)               10 INPLACE_ADD --> (value in t[a]) += b --> выполняется, так как список изменяемый               12 ROT_THREE               14 STORE_SUBSCR --> Assign t[a] = our list --> Ошибка, t[a] неизменяемый.               16 LOAD_CONST               0 (None)               18 RETURN_VALUE

Это перевод статьи на Medium.


Источник: proglib.io

Комментарии: