Джефф хорошо ответил на твой вопрос. При этом, есть одна вещь, которую стоит отметить. Получение длины списка (это на самом деле список изнутри) имеет значение O (1), что означает, что это не требует реального времени. Длина самого списка хранится вместе с метаданными и не пересчитывается. Единственная реальная стоимость - это накладные расходы на вызов функции. Использование «конца», вероятно, все еще быстрее, но не так много, как вы могли подумать.
Но "на самом деле список под капотом", я имею в виду, что переводчик в настоящее время рассматривает его как список (есть более глубокое объяснение, но здесь не стоит вдаваться) Поскольку вы используете [lrange] для значения, интерпретатор должен преобразовать его внутренне в список ... так что вы в значительной степени гарантируете поведение O (1) [llength].