Почему [] быстрее, чем list()?
Я сравнил скорости обработки []
и list()
в Python 3.11. Результаты меня удивили: []
работает примерно в два раза быстрее, чем list()
. Вот данные, которые я получил:
$ python -m timeit '[]'
20000000 loops, best of 5: 11.3 nsec per loop
$ python -m timeit 'list()'
10000000 loops, best of 5: 26.1 nsec per loop
Аналогичные результаты я получил для {}
и dict()
:
$ python -m timeit '{}'
20000000 loops, best of 5: 11.6 nsec per loop
$ python -m timeit 'dict()'
10000000 loops, best of 5: 27.1 nsec per loop
Почему так происходит? Означает ли это, что []
и {}
(возможно, также ()
и ''
) моментально возвращают копии каких-то пустых литералов, в то время как их явно именованные аналоги (list()
, dict()
, tuple()
, str()
) проходят полный процесс создания объекта, независимо от того, есть ли у них элементы или нет?
1 ответ(ов)
В Python использование list()
требует выполнения глобального поиска и вызова функции, тогда как []
компилируется в одну инструкцию. Это можно проиллюстрировать с помощью модуля dis
, который показывает байт-код, генерируемый для обеих конструкций.
Пример:
Python 2.7.3
>>> import dis
>>> dis.dis(lambda: list())
1 0 LOAD_GLOBAL 0 (list)
3 CALL_FUNCTION 0
6 RETURN_VALUE
>>> dis.dis(lambda: [])
1 0 BUILD_LIST 0
3 RETURN_VALUE
Как видно из примера, вызов list()
сначала выполняет загрузку глобальной функции list
, а затем вызывает её, что добавляет накладные расходы. Напротив, использование []
приводит к созданию списка, компилируемому в одну инструкцию BUILD_LIST
. Поэтому в случаях, когда производительность критична, рекомендуется использовать []
для создания пустых списков.
Самый быстрый способ проверить наличие значения в списке
Получить различия между двумя списками с уникальными элементами
Как получить последний элемент списка?
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Нахождение среднего значения списка