Я только что понял, что CPython, кажется, обрабатывает константные выражения, которые представляют одно и то же значение, по-разному в отношении свертывания констант. Например:
>>> import dis
>>> dis.dis('2**66')
1 0 LOAD_CONST 0 (2)
2 LOAD_CONST 1 (66)
4 BINARY_POWER
6 RETURN_VALUE
>>> dis.dis('4**33')
1 0 LOAD_CONST 2 (73786976294838206464)
2 RETURN_VALUE
Во втором примере применяется постоянное свертывание, а в первом нет, хотя оба представляют одно и то же значение. Кажется, это не связано ни со значением показателя степени, ни с величиной результата, поскольку следующие выражения также складываются:
>>> dis.dis('2.0**66')
1 0 LOAD_CONST 2 (7.378697629483821e+19)
2 RETURN_VALUE
>>> dis.dis('4**42')
1 0 LOAD_CONST 2 (19342813113834066795298816)
2 RETURN_VALUE
Почему первые два выражения обрабатываются по-разному и, в более общем смысле, каковы конкретные правила, которым следует CPython для свертывания констант?
Протестировано на:
$ python3.6 --version
Python 3.6.5 :: Anaconda, Inc.
$ python3.7 --version
Python 3.7.1
dis.dis('2**66')
показывает свертывание констант в 3.6. - person user2357112 supports Monica   schedule 02.05.2019dis.dis('2**66')
(Python 3.7.0 (v3.7.0:1bf9cc5093, 27 июня 2018 г., 04:59:51) [MSC v.1914 64 бит (AMD64)] на win32) - в частности, кажется, что он складывает любую степень двойки с показателем степени 64 или меньше, но переключается на использованиеBINARY_POWER
для любого показателя степени выше 64. - person Grismar   schedule 02.05.2019