[Python-ideas] Bytecode for calling function with keyword arguments

Serhiy Storchaka storchaka at gmail.com
Thu Apr 21 11:52:56 EDT 2016


Currently the call of function with keyword arguments (say `f(a, b, x=c, 
y=d)`) is compiled to following bytecode:

       0 LOAD_NAME                0 (f)
       3 LOAD_NAME                1 (a)
       6 LOAD_NAME                2 (b)
       9 LOAD_CONST               0 ('x')
      12 LOAD_NAME                3 (c)
      15 LOAD_CONST               1 ('y')
      18 LOAD_NAME                4 (d)
      21 CALL_FUNCTION          514 (2 positional, 2 keyword pair)

For every positional argument its value is pushed on the stack, and for 
every keyword argument its name and its value are pushed on the stack. 
But keyword arguments are always constant strings! We can reorder the 
stack, and push keyword argument values and names separately. And we can 
save all keyword argument names for this call in a constant tuple and 
load it by one bytecode command.

       0 LOAD_NAME                0 (f)
       3 LOAD_NAME                1 (a)
       6 LOAD_NAME                2 (b)
       9 LOAD_NAME                3 (c)
      12 LOAD_NAME                4 (d)
      15 LOAD_CONST               0 (('x', 'y'))
      18 CALL_FUNCTION2           2

Benefits:

1. We save one command for every keyword parameter after the first. This 
saves bytecode size and execution time.

2. Since the number of keyword arguments is obtained from tuple's size, 
new CALL_FUNCTION opcode needs only the number of positional arguments. 
It's argument is simpler and needs less bits (important for wordcode).

Disadvantages:

1. Increases the number of constants.



More information about the Python-ideas mailing list