2016-05-23 4 views
2

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

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

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

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

ответ

4

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

Это потому, что кортежи гетерогенной, списки однородные; в то время как списки имеют порядок, кортежи должны иметь структуру . В результате кортежи означают относительно маленький, а списки могут быть (очень) большими. См. What's the difference between lists and tuples?

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

+0

Ага, поэтому я рассматривал его как оптимизацию для _not_ для 't___ метода' __reversed __() 'для кортежей, но на самом деле это просто вопрос не стоило реализовывать, даже не считал, что по какой-то причине сразу подумал оптимизация. Благодаря! –