[Python-Dev] Don't set local variable in a list comprehension or generator

Victor Stinner victor.stinner at haypocalc.com
Thu May 19 12:39:57 CEST 2011


Le mercredi 18 mai 2011 à 21:44 -0400, Terry Reedy a écrit :
> On 5/18/2011 5:34 PM, Victor Stinner wrote:
> 
> You initial example gave me the impression that the issue has something 
> to do with join in particular, or even comprehensions in particular. It 
> is really about for loops.
> 
>  >>> dis('for x in range(3): y = x*x')
>    ...
>          >>   13 FOR_ITER                16 (to 32)
>               16 STORE_NAME               1 (x)
>               19 LOAD_NAME                1 (x)
>               22 LOAD_NAME                1 (x)
>               25 BINARY_MULTIPLY
>               26 STORE_NAME               2 (y)
>   ...

Yeah, "STORE_NAME; LOAD_NAME; LOAD_NAME" can be replaced by a single
opcode: DUP_TOP. But the user expects x to be defined outside the loop:

>>> for x in range(3): y = x*x
... 
>>> x
2

Well, it is possible to detect if x is used or not after the loop, but
it is a little more complex to optimize than list
comprehension/generator :-)

> .. you cannot get that with Python code without a much smarter optimizer.

Yes, I would like to write a smarter optimizer. But I first asked if it
would accepted to avoid the temporary loop variable because it changes
the Python language: the user can expect a loop variable using
introspection or a debugger. That's why I suggested to only enable the
optimization if Python is running in optimized mode (python -O or python
-OO).

Victor



More information about the Python-Dev mailing list