[Python-Dev] tuple[int] optimization

Ryan Kelly ryan at rfk.id.au
Sun Jul 24 01:13:07 CEST 2011


On Sun, 2011-07-24 at 01:20 +0300, Andrew Svetlov wrote:
> tuple[int] is 30% slower than list[int].
> Please let me explain the problem.
> 
> (1, 2, 3)[1] has compiled as BINARY_SUBSCR operation.
> ceval.c has optimization for list:
> 
>         case BINARY_SUBSCR:
>             w = POP();
>             v = TOP();
>             if (PyList_CheckExact(v) && PyInt_CheckExact(w)) {
>                 /* INLINE: list[int] */
>                 Py_ssize_t i = PyInt_AsSsize_t(w);
>                 if (i < 0)
>                     i += PyList_GET_SIZE(v);
>                 if (i >= 0 && i < PyList_GET_SIZE(v)) {
>                     x = PyList_GET_ITEM(v, i);
>                     Py_INCREF(x);
>                 }
>                 else
>                     goto slow_get;
>             }
>             else
>               slow_get:
>                 x = PyObject_GetItem(v, w);
>             Py_DECREF(v);
>             Py_DECREF(w);
>             SET_TOP(x);
>             if (x != NULL) continue;
>             break;
> 
> For tuple code follows slow way via tp_as_mapping slot and calls
> tuplesubscript from Objects/tupleobject.c
> 
> Looks like tuple is goot applicant to be optimized as list does.
> tuples is used in python programs very often and getting element from
> tuple by index as common operation as list[int].
> 
> Is there reasons to prevent special case for tuples in BINARY_SUBSCR?

In latest trunk this optimisation seems to have gone away, the code is
now:

        TARGET(BINARY_SUBSCR)
            w = POP();
            v = TOP();
            x = PyObject_GetItem(v, w);
            Py_DECREF(v);
            Py_DECREF(w);
            SET_TOP(x);
            if (x != NULL) DISPATCH();
            break;

The implementation of PyObject_GetItem doesn't appear to have changed
though.  Maybe this optimisation was no longer worth it in practice? 


  Ryan



-- 
Ryan Kelly
http://www.rfk.id.au  |  This message is digitally signed. Please visit
ryan at rfk.id.au        |  http://www.rfk.id.au/ramblings/gpg/ for details

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 198 bytes
Desc: This is a digitally signed message part
URL: <http://mail.python.org/pipermail/python-dev/attachments/20110724/6815fe62/attachment.pgp>


More information about the Python-Dev mailing list