Surprised by the lack of constant folding

Tim Chase python.list at tim.thechases.com
Fri Mar 24 15:35:15 EDT 2017


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






More information about the Python-list mailing list