Faster list setting when bounds check and wrapparound are disabled.
authorRobert Bradshaw <robertwb@gmail.com>
Sat, 2 Feb 2013 07:53:10 +0000 (23:53 -0800)
committerRobert Bradshaw <robertwb@gmail.com>
Sat, 9 Feb 2013 19:24:55 +0000 (11:24 -0800)
Cython/Compiler/ExprNodes.py
Cython/Utility/ObjectHandling.c

index 73bbd84..3ad7414 100755 (executable)
@@ -3172,7 +3172,13 @@ class IndexNode(ExprNode):
 
     def generate_setitem_code(self, value_code, code):
         if self.index.type.is_int:
-            function = "__Pyx_SetItemInt"
+            if (self.base.type.is_builtin_type
+                and self.base.type.name == "list"
+                and not code.globalstate.directives['wraparound']
+                and not code.globalstate.directives['boundscheck']):
+                function = "__Pyx_SetItemListInt_NoCheck"
+            else:
+                function = "__Pyx_SetItemInt"
             index_code = self.index.result()
             code.globalstate.use_utility_code(
                 UtilityCode.load_cached("SetItemInt", "ObjectHandling.c"))
index 2da2148..b18be23 100644 (file)
@@ -354,6 +354,19 @@ static CYTHON_INLINE int __Pyx_SetItemInt_Fast(PyObject *o, Py_ssize_t i, PyObje
     return __Pyx_SetItemInt_Generic(o, PyInt_FromSsize_t(i), v);
 }
 
+
+#define __Pyx_SetItemListInt_NoCheck(o, i, v, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \
+                                                    __Pyx_SetItemIntList_NoCheck(o, i, v) : \
+                                                    __Pyx_SetItemInt_Generic(o, to_py_func(i), v))
+
+static CYTHON_INLINE int __Pyx_SetItemIntList_NoCheck(PyObject *o, Py_ssize_t n, PyObject *v) {
+    PyObject* old = PyList_GET_ITEM(o, n);
+    Py_INCREF(v);
+    PyList_SET_ITEM(o, n, v);
+    Py_DECREF(old);
+    return 1;
+}
+
 /////////////// DelItemInt.proto ///////////////
 
 #define __Pyx_DelItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \