Another object -> bint optimization.
authorRobert Bradshaw <robertwb@math.washington.edu>
Tue, 16 Mar 2010 19:23:55 +0000 (12:23 -0700)
committerRobert Bradshaw <robertwb@math.washington.edu>
Tue, 16 Mar 2010 19:23:55 +0000 (12:23 -0700)
__Pyx_PyObject_IsTrue now has only a single branch, even at -O0.
(The bitwise | is intentional.) This is only a 2.5% or so speedup
in my microbenchmarks, but it's something.

Cython/Compiler/PyrexTypes.py

index 3ef2eef9e7e9fa18f77baf4ddf2d50d05634d7e3..19dd80dcf982a8da2d85d79abd99b4ec9e110002 100755 (executable)
@@ -2485,12 +2485,13 @@ static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*);
 
 """ + type_conversion_predeclarations
 
+# Note: __Pyx_PyObject_IsTrue is written to minimize branching.
 type_conversion_functions = """
 /* Type Conversion Functions */
 
 static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
-   if (x == Py_True) return 1;
-   else if ((x == Py_False) || (x == Py_None)) return 0;
+   int is_true = x == Py_True;
+   if (is_true | (x == Py_False) | (x == Py_None)) return is_true;
    else return PyObject_IsTrue(x);
 }