Какие методы и модули Python сделают ваш код чище и эффективнее? Рассмотрим 5 скрытых жемчужин стандартной библиотеки 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
для обычного списка):
В 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.
Больше интересных материалов о Python:
- 29 Python-проектов, оказавших огромное влияние на разработку
- Инструменты Python: лучшая шпаргалка для начинающих
- Самый полный видеокурс по Django от установки до проекта
Комментарии