Speed-up dictionary constructor by about 10%.

New opcode, STORE_MAP saves the compiler from awkward stack manipulations
and specializes for dicts using PyDict_SetItem instead of PyObject_SetItem.

Old disassembly:
              0 BUILD_MAP                0
              3 DUP_TOP
              4 LOAD_CONST               1 (1)
              7 ROT_TWO
              8 LOAD_CONST               2 ('x')
             11 STORE_SUBSCR
             12 DUP_TOP
             13 LOAD_CONST               3 (2)
             16 ROT_TWO
             17 LOAD_CONST               4 ('y')
             20 STORE_SUBSCR

New disassembly:
              0 BUILD_MAP                0
              3 LOAD_CONST               1 (1)
              6 LOAD_CONST               2 ('x')
              9 STORE_MAP
             10 LOAD_CONST               3 (2)
             13 LOAD_CONST               4 ('y')
             16 STORE_MAP
This commit is contained in:
Raymond Hettinger 2007-12-18 18:26:18 +00:00
parent eb103b3577
commit effde12f5f
5 changed files with 19 additions and 5 deletions

View file

@ -729,6 +729,8 @@ opcode_stack_effect(int opcode, int oparg)
return -1;
case STORE_SUBSCR:
return -3;
case STORE_MAP:
return -2;
case DELETE_SUBSCR:
return -2;
@ -2926,13 +2928,11 @@ compiler_visit_expr(struct compiler *c, expr_ty e)
/* We must arrange things just right for STORE_SUBSCR.
It wants the stack to look like (value) (dict) (key) */
for (i = 0; i < n; i++) {
ADDOP(c, DUP_TOP);
VISIT(c, expr,
(expr_ty)asdl_seq_GET(e->v.Dict.values, i));
ADDOP(c, ROT_TWO);
VISIT(c, expr,
(expr_ty)asdl_seq_GET(e->v.Dict.keys, i));
ADDOP(c, STORE_SUBSCR);
ADDOP(c, STORE_MAP);
}
break;
case ListComp_kind: