Эффективность построения кортежей в Python - PullRequest
0 голосов
/ 17 октября 2019

Мне интересно, насколько эффективен конструктор 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...