Surprised by the lack of constant folding

duncan smith duncan at invalid.invalid
Fri Mar 24 16:00:08 EDT 2017


On 24/03/17 19:35, Tim Chase wrote:
> Playing around, I came across the following
> 
> $ python3
> Python 3.4.2 (default, Oct  8 2014, 10:45:20) 
> [GCC 4.9.1] on linux
> Type "help", "copyright", "credits" or "license" for more information.
>>>> from dis import dis
>>>> def f(x):
> ...     return x * 1024 * 1024
> ... 
>>>> dis(f)
>   2           0 LOAD_FAST                0 (x)
>               3 LOAD_CONST               1 (1024)
>               6 BINARY_MULTIPLY
>               7 LOAD_CONST               1 (1024)
>              10 BINARY_MULTIPLY
>              11 RETURN_VALUE
> 
> Is there any reason that Python doesn't do the constant folding of
> 1024 * 1024?  Especially as it does constant folding if the order is
> reversed:
> 
>>>> def f(x):
> ...     return 1024 * 1024 * x
> ... 
>>>> dis(f)
>   2           0 LOAD_CONST               2 (1048576)
>               3 LOAD_FAST                0 (x)
>               6 BINARY_MULTIPLY
>               7 RETURN_VALUE
> 
> 
> I'm cool with defining things as a constant and using those instead
> or front-loading my constants in my expressions, but the disparity
> struck me as a little odd.  Any insights on the reasons/motivations
> for one and not the other?
> 
> -tkc
> 
> 
> 

Left to right evaluation? Depending on the type of x, x * 1024 * 1024
might not return the same result as x * (1024 * 1024). That's my guess.

Duncan



More information about the Python-list mailing list