Мне интересно, насколько эффективен конструктор tuple
по сравнению с конструктором list
.
Вот мое понимание конструкции list
. Выражение list(range(100))
, вероятно, не сразу распознает, что Iterable
имеет 100 элементов, поэтому он создает контейнер с некоторой начальной емкостью по умолчанию и добавляет элементы, пока не заполнится. После заполнения он создает новый контейнер с расширенной емкостью, копирует элементы и повторяет их. Это продолжается до тех пор, пока все элементы из Iterable
не будут исчерпаны.
Рассмотрим выражение tuple(range(100))
. Я предполагаю, что действуют те же механизмы, потому что конструктор tuple
не знает, насколько велик Iterable
. Он должен создать контейнер с некоторой резервной емкостью, заполнить, а затем повторить.
Тип tuple
напрямую хранит элементы (в отличие от list
, в котором хранится ссылка на контейнер, в котором размещены элементы). У tuple
также нет резервной емкости для добавления новых элементов.
Поскольку конструктор tuple
использовал промежуточный контейнер для размещения элементов, означает ли это, что последний шаг tuple
Конструктор предназначен для копирования всех элементов из контейнера в правильный tuple
тип без лишних возможностей? Если это так, это сделает конструктор tuple
менее эффективным, чем конструктор list
, потому что list
, вероятно, просто сохраняет промежуточный контейнер, используемый во время конструирования. Если нет, значит ли это, что tuple
каким-то образом удерживает контейнер, используемый в строительстве?
Я пытался их сравнить, но не получил значимого расхождения.
>>> from timeit import timeit
>>> rng = 5000
>>> num = 5000
>>> print(timeit(stmt=f'tuple(range({rng}))', number=num))
0.444614720006939
>>> print(timeit(stmt=f'list(range({rng}))', number=num))
0.4465303409961052