7

Почему [] быстрее, чем list()?

29

Я сравнил скорости обработки [] и 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 ответ(ов)

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. Поэтому в случаях, когда производительность критична, рекомендуется использовать [] для создания пустых списков.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь