2

Python 中的reversed(seq)内置表示seq必须有__reversed__()方法或支持序列协议。列表和元组显然都支持序列协议,但列表使用了自己的__reversed__()方法。

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

那么__reverse__()列表的优化必须比序列协议为反转提供的更快。因此,我查看了为 listobject.c实现的源代码__reversed__(),并且由于我对 C 知识的有限性,我无法理解为什么元组 ( tupleobject.c ) 不会有类似的内部反转方法,因为元组在我看来在分配和内存方面进行一些优化 ( PyTuple_MAXSAVESIZE) 的 bean 数组,以及一个更熟悉的数组列表。

我缺少什么使实现__reversed__()方法成为列表类型优化的 C 魔法,但标准迭代器协议更适合元组?

4

1 回答 1

4

元组很少以相反的顺序迭代。

那是因为元组是异质的,列表是同质的;虽然列表有顺序,但元组意味着有结构。结果,元组意味着相对较小,而列表可能(非常)大。请参阅列表和元组之间有什么区别?

因此,根本不需要为元组创建反向迭代器;这将是一个过早的优化,只会产生很少的维护成本。

于 2016-05-23T13:50:39.783 回答