Optimizing FOR_ITER bytecode · Issue #91432 · python/cpython (original) (raw)

We can execute one less opcode in every iteration (except for the first) of every for-loop by changing from

    GET_ITER
top:
    FOR_ITER
    [body]
    JUMP_BACKWARDS(top)
cleanup:
end:

to

    GET_ITER
    JUMP_FORWARD(bottom)
body:
    [body]
bottom:
    FOR_END(body)
cleanup:
end:

This was suggested by @markshannon here, but it appears to be similar in spirit to Loop Inversion.

There seems to be a small (on the order of 1%) benefit, but I imagine the benefit will be magnified after any specialization.