New submission from Raymond Hettinger <raymond.hettin...@gmail.com>:
In the show code below, the STORE_FAST x is FOLLOWED by LOAD_FAST x. This is a common word code pairing. Perhaps a new combined opcode would help: case TARGET(LOAD_AND_STORE_FAST): { PyObject *value = GETLOCAL(oparg); if (value == NULL) { format_exc_check_arg(tstate, PyExc_UnboundLocalError, UNBOUNDLOCAL_ERROR_MSG, PyTuple_GetItem(co->co_varnames, oparg)); goto error; } Py_INCREF(value); SETLOCAL(oparg, value); FAST_DISPATCH(); } The combined opcode saves one one trip around the eval-loop and it saves unnecessary stack manipulations (a PUSH() immediately followed by a POP()). The code generation would likely need to be a compiler or AST step because it crosses basic block boundaries. Care would need to be taken to not adversely affect tracing the code in a debugger. Note in the following code, the "x" is never used after the STORE/LOAD pair. In theory, the two opcodes could be dropped entirely; however, would affect a call to "locals()". -------- Code disassembly ------ >>> def f(s): for x in g: yield x**2 >>> dis(f) 2 0 LOAD_GLOBAL 0 (g) 2 GET_ITER >> 4 FOR_ITER 14 (to 20) 6 STORE_FAST 1 (x) 3 8 LOAD_FAST 1 (x) 10 LOAD_CONST 1 (2) 12 BINARY_POWER 14 YIELD_VALUE 16 POP_TOP 18 JUMP_ABSOLUTE 4 >> 20 LOAD_CONST 0 (None) 22 RETURN_VALUE ---------- components: Interpreter Core messages: 354024 nosy: rhettinger priority: normal severity: normal status: open title: Possible wordcode optimization for STORE/LOAD pairs type: performance versions: Python 3.9 _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue38381> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com