我假设tuple(tuple_instance)
应该(作为优化)能够在不进行复制的情况下返回输入元组。事实证明,在CPython上,这个似乎是:
>>> t = ('foo', 'bar', 'baz')
>>> v = tuple(t)
>>> v is t
True
到目前为止还不错。但是,仔细阅读来源,我发现有PyTuple_MAXSAVESIZE 可以进入这里。让我们尝试更大的元组:
>>> t = ('foo', 'bar', 'baz') * 100
>>> v = tuple(t)
>>> v is t
True
这似乎也有效。
我的主要问题是CPython中是否总是出现这种情况。我看了PyTuple_New,但我看不到任何可以解释我在这里看到的东西,所以这个行为必须在其他地方定义(或者我错过了......我的C很萎缩这一点......)。
答案 0 :(得分:2)
好的,所以通话顺序是:
tuple_new在最后调用PySequence_Tuple。 PySequence_Tuple内置了优化,如果它是元组(不是元组子类),它只返回元组(参见PyTuple_CheckExact
的行,实际上是macro ...)
总而言之,当前(CPython2.7.7)在tuple
的实例上调用tuple
将返回输入实例 iff 输入元组的类型是 tuple
。 tuple
的子类将被复制。
似乎也有一个优化的列表路径。这也可能涵盖tuple
子类,但我没有深入挖掘。