在元组上调用元组时的元组身份

时间:2014-06-13 02:49:23

标签: python cpython python-internals

我假设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很萎缩这一点......)。

1 个答案:

答案 0 :(得分:2)

好的,所以通话顺序是:

tuple_new在最后调用PySequence_Tuple。 PySequence_Tuple内置了优化,如果它是元组(不是元组子类),它只返回元组(参见PyTuple_CheckExact的行,实际上是macro ...)

总而言之,当前(CPython2.7.7)在tuple的实例上调用tuple将返回输入实例 iff 输入元组的类型 tupletuple的子类将被复制。

似乎也有一个优化的列表路径。这也可能涵盖tuple子类,但我没有深入挖掘。