[Python-Dev] Type of range object members

"Martin v. Löwis" martin at v.loewis.de
Thu Aug 17 08:01:58 CEST 2006


Greg Ewing schrieb:
>>> Also it means you'd pay a penalty every time you
>>> access it
>> That penalty is already paid today.
> 
> You'd still have that penalty, *plus* the
> overhead of bit masking to get at the value.

No, the penalty gets smaller if there is only a single type.
For example, abstract.c now has

                if (res && (!PyInt_Check(res) && !PyLong_Check(res))) {
                        PyErr_Format(PyExc_TypeError,
                                     "__int__ returned non-int (type
%.200s)",
                                     res->ob_type->tp_name);
                        Py_DECREF(res);
                        return NULL;
                }

Currently, if a long int is returned, it performs two subtype tests.
If the long type is dropped, the second test can go away. In this
specific code, there is no penalty for a representation flag, since
the value is not accessed.

Code that wants to support both int and long and needs the value
often does PyLong_AsLong these days, which will support int as well.
This currently reads

        if (vv == NULL || !PyLong_Check(vv)) {
                if (vv != NULL && PyInt_Check(vv))
                        return PyInt_AsLong(vv);
                PyErr_BadInternalCall();
                return -1;
        }

Notice that this has two checks if this is an int, and both are subtype
checks. With a single type, this would become

        if (vv == NULL || !PyInt_Check(vv)) {
                PyErr_BadInternalCall();
                return -1;
        }
        if (!vv->ob_size)
                return PyInt_AsLong(vv);

Actually, the implementation of PyInt_AsLong might get inlined;
it currently starts with a third PyInt_Check.

So overall, I would expect that a single type would improve performance,
not decrease it.

As you say, any change is likely not noticeable in performance, though,
either way.

Regards,
Martin


More information about the Python-Dev mailing list