Содржина на објавата
Кроме типа 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