SF patch #910929: Optimize list comprehensions

Add a new opcode, LIST_APPEND, and apply it to the code generation for
list comprehensions.  Reduces the per-loop overhead by about a third.
This commit is contained in:
Raymond Hettinger 2004-03-07 07:31:06 +00:00
parent bff63f0343
commit dd80f76265
6 changed files with 20 additions and 3 deletions

View file

@ -1225,6 +1225,15 @@ eval_frame(PyFrameObject *f)
if (x != NULL) continue;
break;
case LIST_APPEND:
w = POP();
v = POP();
err = PyList_Append(v, w);
Py_DECREF(v);
Py_DECREF(w);
if (err == 0) continue;
break;
case INPLACE_POWER:
w = POP();
v = TOP();

View file

@ -1552,8 +1552,7 @@ com_list_iter(struct compiling *c,
com_addop_varname(c, VAR_LOAD, t);
com_push(c, 1);
com_node(c, e);
com_addoparg(c, CALL_FUNCTION, 1);
com_addbyte(c, POP_TOP);
com_addbyte(c, LIST_APPEND);
com_pop(c, 2);
}
}
@ -1569,7 +1568,6 @@ com_list_comprehension(struct compiling *c, node *n)
com_addoparg(c, BUILD_LIST, 0);
com_addbyte(c, DUP_TOP); /* leave the result on the stack */
com_push(c, 2);
com_addop_name(c, LOAD_ATTR, "append");
com_addop_varname(c, VAR_STORE, tmpname);
com_pop(c, 1);
com_list_for(c, CHILD(n, 1), CHILD(n, 0), tmpname);