Есть нет правил для постоянного сворачивания.Есть только детали реализации.Они изменились раньше, и они изменятся снова.
Черт, вы даже не можете говорить о «поведении Python 3» или «поведении Python 3.6», потому что эти детали реализации изменились между 3.6. 4 и 3,6. 5 .На 3.6.4 пример 2**66
постоянно сворачивается.
Пока, и никто не знает, как долго продлится «сейчас», детали реализации заключаются в том, что в оптимизаторе AST предусмотрены меры предосторожности для предотвращения расходов.слишком много времени или памяти на постоянное сворачивание.Защита для 2**66
или 4**33
основана на количестве битов в LHS и значении RHS:
if (PyLong_Check(v) && PyLong_Check(w) && Py_SIZE(v) && Py_SIZE(w) > 0) {
size_t vbits = _PyLong_NumBits(v);
size_t wbits = PyLong_AsSize_t(w);
if (vbits == (size_t)-1 || wbits == (size_t)-1) {
return NULL;
}
if (vbits > MAX_INT_SIZE / wbits) {
return NULL;
}
}
MAX_INT_SIZE
равно #define
d.ранее как 128. Поскольку 2
является 2-битным числом, а 4
является 3-битным числом, расчетный размер результата меньше для 4**33
, поэтому он проходит проверку и получает постоянное свертывание.
В Python 3.6.5 детали реализации в основном схожи, но это постоянное свертывание происходит в оптимизаторе глазкового отверстия вместо оптимизатора AST, которого нет в 3.6.5.
На Python 3.6.4 гарантия предварительной проверки не существует.Оптимизатор глазка будет отбрасывать слишком большие постоянные результаты свертывания после их вычисления, что приведет к другим порогам, чем предварительные проверки.