Кроме типа integer кешированию подвергаются и строки, но не все. Строки, которые больше всего подходят для использования в ключах словарей или как имена Python-объектов кешируются для оптимизации доступа к данным. А именно:
🔹 в словарях по ключу
🔹 для методов getattr и setattr
Чтобы строка попала в таблицу interned strings (закешировалась), она должна подходить под следующие правила:
🔸 символы должны входить в список "name characters"
Если коротко, это то что попадает под паттерн regex
[a-zA-Z0-9_]
То есть строки, похожие на имена объектов.
🔸 строка должна быть длиной до 4096 символов включительно
>>> a = 'a'*4096
>>> b = 'a'*4096
>>> a is b
True
>>> a = 'a'*4097
>>> b = 'a'*4097
>>> a is b
False
🔸 строка должна быть определена в коде как константа но не создана динамически.
В константу также входят строки, которые таковыми становятся в результате оптимизации на этапе компиляции байт кода .
Простые константы
>>> a = 'python'
>>> b = 'python'
>>> a is b
True
Динамически созданная строка
>>> a = 'python'
>>> b = ''.join('python')
>>> a is b
False
Оптимизированный код
>>> a = 'python'
>>> b = 'pyt'+'hon'
>>> a is b
True
Создание строки b оптимизировано в константу 'python' на этапе компиляции байт кода.
Также к динамически созданным строкам относятся те, что прочитаны из файлов или получены по сети
>>> a = 'python'
>>> open(tempfile, 'w').write(a)
>>> b = open(tempfile).read()
>>> a is b
Flase
>>> a = requests.get(url).content()
>>> b = requests.get(url).content()
>>> a is b
Flase
#tricks