Несколько слов о микрооптимизациях производительности | OTUS
OTUS исполняется 3 года!
Скидки до 30% в честь дня рождения! Успейте купить курс по выгодной цене ➞
Выбрать курс

Курсы

Программирование
MS SQL Server разработчик AWS для разработчиков CI/CD на AWS, Azure и Gitlab Архитектура и шаблоны проектирования
-20%
Разработчик C++
-20%
Разработчик Java
-20%
React.js разработчик
-20%
Интенсив "Оптимизация в Java"
-50%
Framework Laravel
-30%
Базы данных
-20%
Разработчик на Spring Framework
-20%
Разработчик Golang
-10%
Разработчик C#
-10%
Team Lead 2.0
-30%
Vue.js разработчик
-20%
Разработчик Java Enterprise ReactJS/React Native-разработчик Разработчик голосовых ассистентов и чат-ботов
Специализации Курсы в разработке Подготовительные курсы
+7 499 110-61-65

Несколько слов о микрооптимизациях производительности

Python_Deep_17.07_Site.png

Чаще всего микрооптимизации производительности только ухудшают качество кода, его становится сложнее читать. Но их полезно знать и хорошо бы в них разбираться, потому что сам процесс исследования позволяет глубже понять язык.

Например, что быстрее: {} или dict()? Ну или, [] или list()?

На поставленный вопрос легко ответить, воспользовавшись timeit. [] и {} в несколько раз быстрее их оппонентов. Более интересный вопрос: почему?

В данном случае ответить нам поможет модуль dis:

>>> dis.dis(compile('[]', '', 'eval'))
  1           0 BUILD_LIST               0
              3 RETURN_VALUE        
>>> dis.dis(compile('list()', '', 'eval'))
  1           0 LOAD_NAME                0 (list)
              3 CALL_FUNCTION            0
              6 RETURN_VALUE

Как можно видеть, в случае [] Python сразу создаёт байткод-инструкцию построения списка, потому что [], как и {}, являются токенами языка, которые, грубо говоря, сразу можно интерпретировать.

list() и dict() же представляют из себя вызов функции, для которого нужно сначала отрезолвить их имя (поискать в globals и builtin), создать новый фрейм на стеке. Поиска в глобальной namespace’е ещё можно избежать, сохранив имя локально. Т.е. сделав, например:

_list = list

Но от CALL_FUNCTION избавиться не выйдет никак.

Есть вопрос? Напишите в комментариях!

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
🔥 Скидки до 50% на новые супер-интенсивы!
«Тестирование игр», «Data Engineer», «работа с протоколом BGP». Узнайте подробности в чате ➞