[Python-Dev] New opcode to simplifiy/speedup list comprehensions

Raymond Hettinger raymond.hettinger at verizon.net
Sat Mar 6 08:27:02 EST 2004


If there are no objections, I would like to add an opcode for calling
PyList_Append().  This simplifies the generated code for list
comprehensions and reduces the overhead on each pass, improving the
timings by about 35% on [i for i in itertools.repeat(None, 500)].

The patch is amazingly brief and clear:
	www.python.org/sf/910929


Raymond Hettinger




##### Current disassembly of a list comprehension
>>> from dis import dis
>>> def f(x):
	y = [i+i for i in x]

>>> dis(f)
  2           0 BUILD_LIST               0
              3 DUP_TOP             
              4 LOAD_ATTR                0 (append)    <-- delete this
line
              7 STORE_FAST               3 (_[1])
             10 LOAD_FAST                0 (x)
             13 GET_ITER            
        >>   14 FOR_ITER                20 (to 37)
             17 STORE_FAST               2 (i)
             20 LOAD_FAST                3 (_[1])
             23 LOAD_FAST                2 (i)
             26 LOAD_FAST                2 (i)
             29 BINARY_ADD          
             30 CALL_FUNCTION            1              --> replace with
LIST_APPEND
             33 POP_TOP                                 <-- delete this
line
             34 JUMP_ABSOLUTE           14
        >>   37 DELETE_FAST              3 (_[1])
             40 STORE_FAST               1 (y)
             43 LOAD_CONST               0 (None)
             46 RETURN_VALUE        


##### Proposed disassembly of a list comprehension
  2           0 BUILD_LIST               0
              3 DUP_TOP             
              4 STORE_FAST               3 (_[1])
              7 LOAD_FAST                0 (x)
             10 GET_ITER            
        >>   11 FOR_ITER                17 (to 31)
             14 STORE_FAST               2 (i)
             17 LOAD_FAST                3 (_[1])
             20 LOAD_FAST                2 (i)
             23 LOAD_FAST                2 (i)
             26 BINARY_ADD          
             27 LIST_APPEND         
             28 JUMP_ABSOLUTE           11
        >>   31 DELETE_FAST              3 (_[1])
             34 STORE_FAST               1 (y)
             37 LOAD_CONST               0 (None)
             40 RETURN_VALUE




More information about the Python-Dev mailing list