Почему у списков есть специальный метод __reverse__(), а в Python кортежей нет?

reversed(seq)встроенный в Python указывает, чтоseqдолжен иметь__reversed__() метод или поддержка протокола последовательности. Списки и кортежи, очевидно, поддерживают протокол последовательности, но списки имеют свои собственные __reversed__() метод используется вместо

>>> hasattr(list, '__reversed__')
True
>>> hasattr(tuple, '__reversed__')
False

Тогда должна быть более быстрая оптимизация в__reverse__()для списка, чем протокол последовательности обеспечил бы для обращения. Итак, я взглянул на исходный код, где __reversed__() реализован для listobject.c, и из-за моих весьма ограниченных знаний C я не могу понять, почему кортеж ( tupleobject.c) не имеет подобных внутренних методов реверсирования, так как мне кажется, что кортеж - это bean-массив с некоторыми оптимизациями (PyTuple_MAXSAVESIZE) на распределение и память, и список, чтобы быть более знакомым массивом.

Какая магия C мне не хватает, что делает реализацию __reversed__() метод оптимизации для типа списка, но стандартный протокол итератора лучше для кортежей?

1 ответ

Решение

Кортежи просто редко повторяются в обратном порядке.

Это потому, что кортежи разнородны, списки однородны; в то время как списки имеют порядок, кортежи должны иметь структуру. В результате, кортежи должны быть относительно маленькими, а списки могут быть (очень) большими. См. В чем разница между списками и кортежами?

Таким образом, просто нет необходимости создавать обратный итератор для кортежей; это было бы преждевременной оптимизацией, создающей затраты на техническое обслуживание за очень небольшой выигрыш

Другие вопросы по тегам