From: Raymond Hettinger <python@rcn.com>
Date: Wed, 26 Feb 2003 18:11:50 +0000 (+0000)
Subject: Micro-optimizations.
X-Git-Tag: v2.3c1~1675
X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=21012b82355b9a3ad09208d0fb9e3f08de6b2ad3;p=python

Micro-optimizations.
* List/Tuple checkexact is faster for the common case.
* Testing for Py_True and Py_False can be inlined for faster looping.
---

diff --git a/Python/ceval.c b/Python/ceval.c
index 9a5d03994d..5286d25605 100644
--- a/Python/ceval.c
+++ b/Python/ceval.c
@@ -1655,7 +1655,7 @@ eval_frame(PyFrameObject *f)
 
 		case UNPACK_SEQUENCE:
 			v = POP();
-			if (PyTuple_Check(v)) {
+			if (PyTuple_CheckExact(v)) {
 				if (PyTuple_Size(v) != oparg) {
 					PyErr_SetString(PyExc_ValueError,
 						 "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) {
 					PyErr_SetString(PyExc_ValueError,
 						  "unpack list of wrong size");
@@ -1975,7 +1975,14 @@ eval_frame(PyFrameObject *f)
 			continue;
 
 		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)
 				err = 0;
 			else if (err == 0)
@@ -1985,7 +1992,14 @@ eval_frame(PyFrameObject *f)
 			continue;
 
 		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) {
 				err = 0;
 				JUMPBY(oparg);