diff Python/compile.c @ 44334:07aa19170a67 legacy-trunk

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
author Raymond Hettinger <python@rcn.com>
date Tue, 18 Dec 2007 18:26:18 +0000
parents 8e13d3eacacc
children 7ac117b3be37
line wrap: on
line diff
--- a/Python/compile.c	Tue Dec 18 09:12:10 2007 +0000
+++ b/Python/compile.c	Tue Dec 18 18:26:18 2007 +0000
@@ -729,6 +729,8 @@
 			return -1;
 		case STORE_SUBSCR:
 			return -3;
+		case STORE_MAP:
+			return -2;
 		case DELETE_SUBSCR:
 			return -2;
 
@@ -2926,13 +2928,11 @@
 		/* 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: