Два факта об int в Python
Один забавный факт привел меня к открытию другого :)
Читал Fluent Python и наткнулся на пример кода, который меня заинтересовал (помимо миллиона других, книга – топ). В главе про конкурентность и работу GIL была константа NUMBERS с необычным значением:
NUMBERS = 5_000_111_000_222_021
Нижние подчеркивания
Если не встречали в работе или документации, то вряд ли знаете (как и я): в числах можно использовать _ для читаемости. Интерпретатор их игнорирует:
>>> x = 1_2 >>> y = 12 >>> x == y True >>> x is y True
Особенно удобно в высокоразрядных числах. Согласитесь 5_000_111_000_222_021 куда проще читать, чем 5000111000222021
Кеш малых чисел
Примеры ниже разбирал на домашнем ноуте с Cpython 3.13.11 и 3.14.3.
Пока игрался, меня заинтересовал один прикол. Я попробовал тот же пример с большими числами:
>>> x = 100_500 >>> y = 100500 >>> x == y True >>> x is y False # Но ведь в примере выше было True..
Почему переменные больше не ссылаются на один объект?
В Cpython есть кеш для маленьких чисел, чтобы частые значения переменных не занимали много памяти и код был отзывчивее.
Ответ на вопрос: «где граница, до которой числа закешированы?» я решил не гуглить, проверил небольшим скриптом:
>>> x = 0 >>> y = 0 >>> for n in range(1000): ... print(f'If {x=} and {y=}, x is y: {x is y}') ... x += 1 ... y += 1 # Пропустим часть строк If x=254 and y=254, x is y: True If x=255 and y=255, x is y: True If x=256 and y=256, x is y: True If x=257 and y=257, x is y: False # Вот и граница If x=258 and y=258, x is y: False ...
Сначала я сделал эмпирически вывод, что закеширован диапазон 0 – 256. Но после самопроверки с гуглом узнал, что также в амортизированный диапазон входят числа от -5 до -1. Итого : от -5 до 256 включительно.
UPD 15.03.2026. Добрый дядя в комментах принес ссылку на pr в Cpython 3.15, где кеш малых чисел увеличен до 1024 :). Ух, заживем..
Для присвоения переменным чисел вне диапазона, интерпретатор начнет выделять уже раздельные области памяти и is станет возвращать False.
Так то. В оптимизации пригодится вряд ли, но удивить друзей в баре сможете.