Tail recursion to while iteration in 2 easy steps

Steven D'Aprano steve+comp.lang.python at pearwood.info
Wed Oct 2 21:24:10 EDT 2013


On Wed, 02 Oct 2013 18:17:06 -0400, Terry Reedy wrote:

> CPython core developers have be very conservative about what
> tranformations they put into the compiler. (1,2,3) can always be
> compiled as a constant, and so it is. [1,2,3] might or might not be a
> constant, depending on the context, and no attempt is made to analyze
> that.

The first sentence of this is correct. The next two don't quite make 
sense to me, since I don't understand what you mean by "constant" in this 
context. I *think* you might be referring to the LOAD_CONST byte-code, 
which in Python 3.3 understands tuples like (1, 2, 3), but not lists. So 
a literal (1, 2, 3) gets created at compile-time with a single LOAD_CONST 
call:

py> from dis import dis
py> dis(compile("x = (1, 2, 3)", '', 'exec'))
  1           0 LOAD_CONST               4 ((1, 2, 3))
              3 STORE_NAME               0 (x)
              6 LOAD_CONST               3 (None)
              9 RETURN_VALUE


while a literal [1, 2, 3] does not:


py> dis(compile("x = [1, 2, 3]", '', 'exec'))
  1           0 LOAD_CONST               0 (1)
              3 LOAD_CONST               1 (2)
              6 LOAD_CONST               2 (3)
              9 BUILD_LIST               3
             12 STORE_NAME               0 (x)
             15 LOAD_CONST               3 (None)
             18 RETURN_VALUE


But I don't think this is a necessary language limitation. Both (1, 2, 3) 
and [1, 2, 3] are known at compile time: the first cannot be anything 
other than a tuple of three ints, and the second a list of three ints. It 
seems to me that an implementation might provide a single byte-code to 
build list literals, perhaps even LOAD_CONST itself. The byte-codes used 
by the Python VM are not part of the language definition, and are subject 
to change without warning.

And in fact, if we go all the way back to Python 1.5, even tuple literals 
weren't handled by a single byte-code, they were assembled at runtime 
like lists still are:

[steve at ando ~]$ python1.5
Python 1.5.2 (#1, Aug 27 2012, 09:09:18)  [GCC 4.1.2 20080704 (Red Hat 
4.1.2-52)] on linux2
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>> from dis import dis
>>> dis(compile("x = (1, 2, 3)", '', 'exec'))
          0 SET_LINENO          0

          3 SET_LINENO          1
          6 LOAD_CONST          0 (1)
          9 LOAD_CONST          1 (2)
         12 LOAD_CONST          2 (3)
         15 BUILD_TUPLE         3
         18 STORE_NAME          0 (x)
         21 LOAD_CONST          3 (None)
         24 RETURN_VALUE




-- 
Steven



More information about the Python-list mailing list