Micro-optimizations.

* List/Tuple checkexact is faster for the common case.
* Testing for Py_True and Py_False can be inlined for faster looping.
This commit is contained in:
Raymond Hettinger 2003-02-26 18:11:50 +00:00
parent a006b8e468
commit 21012b8235
1 changed files with 18 additions and 4 deletions

View File

@ -1655,7 +1655,7 @@ eval_frame(PyFrameObject *f)
case UNPACK_SEQUENCE: case UNPACK_SEQUENCE:
v = POP(); v = POP();
if (PyTuple_Check(v)) { if (PyTuple_CheckExact(v)) {
if (PyTuple_Size(v) != oparg) { if (PyTuple_Size(v) != oparg) {
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
"unpack tuple of wrong size"); "unpack tuple of wrong size");
@ -1669,7 +1669,7 @@ eval_frame(PyFrameObject *f)
} }
} }
} }
else if (PyList_Check(v)) { else if (PyList_CheckExact(v)) {
if (PyList_Size(v) != oparg) { if (PyList_Size(v) != oparg) {
PyErr_SetString(PyExc_ValueError, PyErr_SetString(PyExc_ValueError,
"unpack list of wrong size"); "unpack list of wrong size");
@ -1975,7 +1975,14 @@ eval_frame(PyFrameObject *f)
continue; continue;
case JUMP_IF_FALSE: case JUMP_IF_FALSE:
err = PyObject_IsTrue(TOP()); w = TOP();
if (w == Py_True)
continue;
if (w == Py_False) {
JUMPBY(oparg);
continue;
}
err = PyObject_IsTrue(w);
if (err > 0) if (err > 0)
err = 0; err = 0;
else if (err == 0) else if (err == 0)
@ -1985,7 +1992,14 @@ eval_frame(PyFrameObject *f)
continue; continue;
case JUMP_IF_TRUE: case JUMP_IF_TRUE:
err = PyObject_IsTrue(TOP()); w = TOP();
if (w == Py_False)
continue;
if (w == Py_True) {
JUMPBY(oparg);
continue;
}
err = PyObject_IsTrue(w);
if (err > 0) { if (err > 0) {
err = 0; err = 0;
JUMPBY(oparg); JUMPBY(oparg);