Почему [] быстрее, чем 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. Поэтому в случаях, когда производительность критична, рекомендуется использовать [] для создания пустых списков.
Самый быстрый способ проверить наличие значения в списке
Получить различия между двумя списками с уникальными элементами
Как клонировать список, чтобы он не изменялся неожиданно после присваивания?
Диапазон букв в Python
Почему statistics.mean() работает так медленно?