Commit eaae26b8 authored by Robert Bradshaw's avatar Robert Bradshaw

Optimized indexing for tuple, list types.

parent ad7b48cd
...@@ -1823,8 +1823,13 @@ class IndexNode(ExprNode): ...@@ -1823,8 +1823,13 @@ class IndexNode(ExprNode):
code.putln("__Pyx_INCREF((PyObject*)%s);" % self.result()) code.putln("__Pyx_INCREF((PyObject*)%s);" % self.result())
elif self.type.is_pyobject: elif self.type.is_pyobject:
if self.index.type.is_int: if self.index.type.is_int:
function = "__Pyx_GetItemInt"
index_code = self.index.result() index_code = self.index.result()
if self.base.type is list_type:
function = "__Pyx_GetItemInt_List"
elif self.base.type is tuple_type:
function = "__Pyx_GetItemInt_Tuple"
else:
function = "__Pyx_GetItemInt"
code.globalstate.use_utility_code(getitem_int_utility_code) code.globalstate.use_utility_code(getitem_int_utility_code)
else: else:
function = "PyObject_GetItem" function = "PyObject_GetItem"
...@@ -5396,6 +5401,33 @@ impl = "" ...@@ -5396,6 +5401,33 @@ impl = ""
getitem_int_utility_code = UtilityCode( getitem_int_utility_code = UtilityCode(
proto = """ proto = """
static INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, Py_ssize_t i, int is_unsigned) {
PyObject *r;
PyObject *j = (likely(i >= 0) || !is_unsigned) ? PyInt_FromLong(i) : PyLong_FromUnsignedLongLong((sizeof(unsigned long long) > sizeof(Py_ssize_t) ? (1ULL << (sizeof(Py_ssize_t)*8)) : 0) + i);
if (!j) return 0;
r = PyObject_GetItem(o, j);
Py_DECREF(j);
return r;
}
static INLINE PyObject *__Pyx_GetItemInt_List(PyObject *o, Py_ssize_t i, int is_unsigned) {
if (likely(0 <= i && i < PyList_GET_SIZE(o))) {
PyObject *r = PyList_GET_ITEM(o, i);
Py_INCREF(r);
return r;
}
else return __Pyx_GetItemInt_Generic(o, i, is_unsigned);
}
static INLINE PyObject *__Pyx_GetItemInt_Tuple(PyObject *o, Py_ssize_t i, int is_unsigned) {
if (likely(0 <= i && i < PyTuple_GET_SIZE(o))) {
PyObject *r = PyTuple_GET_ITEM(o, i);
Py_INCREF(r);
return r;
}
else return __Pyx_GetItemInt_Generic(o, i, is_unsigned);
}
static INLINE PyObject *__Pyx_GetItemInt(PyObject *o, Py_ssize_t i, int is_unsigned) { static INLINE PyObject *__Pyx_GetItemInt(PyObject *o, Py_ssize_t i, int is_unsigned) {
PyObject *r; PyObject *r;
if (PyList_CheckExact(o) && 0 <= i && i < PyList_GET_SIZE(o)) { if (PyList_CheckExact(o) && 0 <= i && i < PyList_GET_SIZE(o)) {
...@@ -5409,11 +5441,7 @@ static INLINE PyObject *__Pyx_GetItemInt(PyObject *o, Py_ssize_t i, int is_unsig ...@@ -5409,11 +5441,7 @@ static INLINE PyObject *__Pyx_GetItemInt(PyObject *o, Py_ssize_t i, int is_unsig
else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0) || !is_unsigned)) else if (Py_TYPE(o)->tp_as_sequence && Py_TYPE(o)->tp_as_sequence->sq_item && (likely(i >= 0) || !is_unsigned))
r = PySequence_GetItem(o, i); r = PySequence_GetItem(o, i);
else { else {
PyObject *j = (likely(i >= 0) || !is_unsigned) ? PyInt_FromLong(i) : PyLong_FromUnsignedLongLong((sizeof(unsigned long long) > sizeof(Py_ssize_t) ? (1ULL << (sizeof(Py_ssize_t)*8)) : 0) + i); r = __Pyx_GetItemInt_Generic(o, i, is_unsigned);
if (!j)
return 0;
r = PyObject_GetItem(o, j);
Py_DECREF(j);
} }
return r; return r;
} }
...@@ -5421,6 +5449,8 @@ static INLINE PyObject *__Pyx_GetItemInt(PyObject *o, Py_ssize_t i, int is_unsig ...@@ -5421,6 +5449,8 @@ static INLINE PyObject *__Pyx_GetItemInt(PyObject *o, Py_ssize_t i, int is_unsig
impl = """ impl = """
""") """)
#------------------------------------------------------------------------------------ #------------------------------------------------------------------------------------
setitem_int_utility_code = UtilityCode( setitem_int_utility_code = UtilityCode(
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment