Несколько слов о микрооптимизациях производительности
Чаще всего микрооптимизации производительности только ухудшают качество кода, его становится сложнее читать. Но их полезно знать и хорошо бы в них разбираться, потому что сам процесс исследования позволяет глубже понять язык.
Например, что быстрее: {} или 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 избавиться не выйдет никак.
Есть вопрос? Напишите в комментариях!