如果您看一下python字节码,那么拆包速度更快的原因变得非常明显:
>>> import dis>>> def unpack_or_index(t=(0, 1)):... _, x = t... x = t[1]... >>> dis.dis(unpack_or_index) 20 LOAD_FAST 0 (t) 3 UNPACK_SEQUENCE 2 6 STORE_FAST 1 (_) 9 STORE_FAST 2 (x) 3 12 LOAD_FAST 0 (t) 15 LOAD_ConST 1 (1) 18 BINARY_SUBSCR 19 STORE_FAST 2 (x) 22 LOAD_ConST 0 (None) 25 RETURN_VALUE
元组拆包操作是一个简单的字节码(
UNPACK_SEQUENCE),而索引操作则必须在元组(
BINARY_SUBSCR)上调用一个方法。解压缩操作可以在python评估循环中内联进行,而订阅调用需要使用来查找元组对象上的函数以检索值
PyObject_GetItem。
的
UNPACK_SEQUENCE操作码的源代码特殊情况下,蟒元组或列表解包,其中所述序列长度的长度参数精确匹配:
if (PyTuple_CheckExact(v) && PyTuple_GET_SIZE(v) == oparg) { PyObject **items = ((PyTupleObject *)v)->ob_item; while (oparg--) { w = items[oparg]; Py_INCREF(w); PUSH(w); } Py_DECREF(v); continue; } // followed by an "else if" statement for a list with similar pre上面的代码进入元组的本机结构,并直接检索值。无需使用繁重的调用,例如
PyObject_GetItem必须考虑到对象可以是自定义python类的调用。
该
BINARY_SUBSCR码只为Python优化
列表 ; 任何不是本地python列表的东西都需要
PyObject_GetItem调用。



