[Python-Dev] Who cares about the performance of these opcodes?

Jeff Epler jepler at unpythonic.net
Tue Mar 9 08:38:01 EST 2004


Recently it was proposed to make a new LIST_APPEND opcode, and several
contributors pointed out that adding opcodes to Python is always a dicey
business because it may hurt performance for obscure reasons, possibly
related to the size of that 'switch' statement.

To that end, I notice that there are several opcodes which could easily
be converted into function calls.  In my code, these are not typically
performance-critical opcodes (with approximate ceval.c line count):
    BUILD_CLASS             # 9 lines
    MAKE_FUNCTION           # 20 lines
    MAKE_CLOSURE            # 35 lines

    PRINT_EXPR              # 21 lines
    PRINT_ITEM              # 47 lines
    PRINT_ITEM_TO           # 2 lines + fallthrough
    PRINT_NEWLINE           # 12 lines
    PRINT_NEWLINE_TO        # 2 lines + fallthrough

Instead, each of these would be available in the code objects co_consts
when necessary.  For example, instead of
    LOAD_CONST               1 (<code object g at 0x40165ea0, file "<stdin>", line 2>)
    MAKE_FUNCTION            0
    STORE_FAST               0 (g)
you'd have
    LOAD_CONST               1 (type 'function')
    LOAD_CONST               2 (<code object g>)
    LOAD_GLOBALS                                 # new opcode, or call globals()
    LOAD_CONST               1 ("g")
    CALL_FUNCTION            3

Performance for these specific operations will certainly benchmark worse,
but maybe getting rid of something like 150 lines from ceval.c would
help other things by magic.  The new LOAD_GLOBALS opcode would be less
than 10 lines.

No, I don't have a patch.  I assume each and every one of these opcodes
has a staunch defender who will now come to its aid, and save me the
trouble.

Jeff



More information about the Python-Dev mailing list