Из документации Python 3 :
sys.intern(string)
Ввести строку в таблицу «интернированных» строк и вернуть
интернированная строка - которая является самой строкой или копией. Интернаты
полезно немного повысить производительность при поиске в словаре - если
ключи в словаре интернированы, а ключ поиска интернирован,
сравнение ключей (после хеширования) может быть выполнено с помощью сравнения указателей
вместо сравнения строк. Обычно имена, используемые в Python
программы автоматически интернируются, а словари используются для хранения
Атрибуты модуля, класса или экземпляра имеют внутренние ключи.
Стажированные строки не бессмертны; Вы должны сохранить ссылку на
верните значение intern (), чтобы получить выгоду от него.
Разъяснение
Как следует из документации, функция sys.intern
предназначена для оптимизации производительности .
Функция sys.intern
поддерживает таблицу из интернированных строк. Когда вы пытаетесь интернировать строку, функция ищет ее в таблице и:
Если строка не существует (еще не была интернирована), функция сохраняет
это в таблице и возвращает это из таблицы интернированных строк.
>>> import sys
>>> a = sys.intern('why do pangolins dream of quiche')
>>> a
'why do pangolins dream of quiche'
В приведенном выше примере a
содержит интернированную строку. Даже при том, что это невидимо, функция sys.intern
сохранила строковый объект 'why do pangolins dream of quiche'
в таблице интернированных строк.
Если строка существует (была интернирована), функция возвращает ее из
таблица интернированных строк.
>>> b = sys.intern('why do pangolins dream of quiche')
>>> b
'why do pangolins dream of quiche'
Даже если это не сразу видно, потому что строка 'why do pangolins dream of quiche'
была интернирована раньше, b
теперь содержит тот же строковый объект, что и a
.
>>> b is a
True
Если мы создадим одну и ту же строку без использования intern, мы получим два разных строковых объекта с одинаковым значением.
>>> c = 'why do pangolins dream of quiche'
>>> c is a
False
>>> c is b
False
Используя sys.intern
, вы гарантируете, что никогда не создадите два строковых объекта с одинаковым значением - когда вы запрашиваете создание второго строкового объекта с тем же значением, что и у существующего строкового объекта, вы получаете ссылку на предварительно Существующий строковый объект. Таким образом, вы экономите память . Кроме того, сравнение строковых объектов теперь очень эффективно , поскольку оно выполняется путем сравнения адресов памяти двух строковых объектов вместо их содержимого.