Mercurial > cpython-lru_cache-weakref
diff Python/compile.c @ 34553:cd04f2d18a6f legacy-trunk
Adopt Skip's idea to optimize lists of constants in the context
of a "in" or "not in" test.
| author | Raymond Hettinger <python@rcn.com> |
|---|---|
| date | Mon, 07 Feb 2005 19:32:38 +0000 |
| parents | 835b645a168f |
| children | e67b587fed77 |
line wrap: on
line diff
--- a/Python/compile.c Mon Feb 07 15:28:45 2005 +0000 +++ b/Python/compile.c Mon Feb 07 19:32:38 2005 +0000 @@ -397,7 +397,9 @@ The consts table must still be in list form so that the new constant (c1, c2, ... cn) can be appended. Called with codestr pointing to the first LOAD_CONST. - Bails out with no change if one or more of the LOAD_CONSTs is missing. */ + Bails out with no change if one or more of the LOAD_CONSTs is missing. + Also works for BUILD_LIST when followed by an "in" or "not in" test. +*/ static int tuple_of_constants(unsigned char *codestr, int n, PyObject *consts) { @@ -406,7 +408,7 @@ /* Pre-conditions */ assert(PyList_CheckExact(consts)); - assert(codestr[n*3] == BUILD_TUPLE); + assert(codestr[n*3] == BUILD_TUPLE || codestr[n*3] == BUILD_LIST); assert(GETARG(codestr, (n*3)) == n); for (i=0 ; i<n ; i++) assert(codestr[i*3] == LOAD_CONST); @@ -753,24 +755,28 @@ cumlc = 0; break; - /* Try to fold tuples of constants. + /* Try to fold tuples of constants (includes a case for lists + which are only used for "in" and "not in" tests). Skip over BUILD_SEQN 1 UNPACK_SEQN 1. Replace BUILD_SEQN 2 UNPACK_SEQN 2 with ROT2. Replace BUILD_SEQN 3 UNPACK_SEQN 3 with ROT3 ROT2. */ case BUILD_TUPLE: + case BUILD_LIST: j = GETARG(codestr, i); h = i - 3 * j; if (h >= 0 && j <= lastlc && - ISBASICBLOCK(blocks, h, 3*(j+1)) && + (opcode == BUILD_TUPLE && + ISBASICBLOCK(blocks, h, 3*(j+1)) || + opcode == BUILD_LIST && + codestr[i+3]==COMPARE_OP && + ISBASICBLOCK(blocks, h, 3*(j+2)) && + (GETARG(codestr,i+3)==6 || GETARG(codestr,i+3)==7)) && tuple_of_constants(&codestr[h], j, consts)) { assert(codestr[i] == LOAD_CONST); cumlc = 1; break; } - /* Intentional fallthrough */ - case BUILD_LIST: - j = GETARG(codestr, i); if (codestr[i+3] != UNPACK_SEQUENCE || !ISBASICBLOCK(blocks,i,6) || j != GETARG(codestr, i+3))
