Интересные заметки и обучающие материалы по Python
Контакт: @paulwinex
⚠️ Рекламу на канале не делаю!⚠️
Хештеги для поиска:
#tricks
#libs
#pep
#basic
#regex
#qt
#django
#2to3
#source
#offtop
Post #127
648
Кроме типа integer кешированию подвергаются и строки, но не все. Строки, которые больше всего подходят для использования в ключах словарей или как имена Python-объектов кешируются для оптимизации доступа к данным. А именно:
🔹 в словарях по ключу
🔹 для методов getattr и setattr
Чтобы строка попала в таблицу interned strings (закешировалась), она должна подходить под следующие правила:
🔸 символы должны входить в список "name characters"
Если коротко, это то что попадает под паттерн regex
🔸 строка должна быть длиной до 4096 символов включительно
В константу также входят строки, которые таковыми становятся в результате оптимизации на этапе компиляции байт кода .
Простые константы
Также к динамически созданным строкам относятся те, что прочитаны из файлов или получены по сети
🔹 в словарях по ключу
🔹 для методов 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





