Это потому, что x
может иметь метод __mul__
с побочными эффектами.x * 10 * 10
вызывает __mul__
дважды, в то время как x * 100
вызывает только один раз:
>>> class Foo(object):
... def __init__ (self):
... self.val = 5
... def __mul__ (self, other):
... print "Called __mul__: %s" % (other)
... self.val = self.val * other
... return self
...
>>> a = Foo()
>>> a * 10 * 10
Called __mul__: 10
Called __mul__: 10
<__main__.Foo object at 0x1017c4990>
Автоматическое сворачивание констант и только один раз вызов __mul__
может изменить поведение.
Вы можетеполучите нужную оптимизацию, переупорядочив операцию так, чтобы константы умножались первыми (или, как упоминалось в комментариях, использовали скобки, чтобы сгруппировать их так, чтобы они просто обрабатывались вместе, независимо от положения), таким образом, выражая ваше желаниескладывание должно произойти:
>>> def f1(x):
... return 10 * 10 * x
...
>>> dis.dis(f1)
2 0 LOAD_CONST 2 (100)
3 LOAD_FAST 0 (x)
6 BINARY_MULTIPLY
7 RETURN_VALUE