Что делает Python sys.intern, делают, и когда он должен использоваться?

break остановился бы foreach, цикл полностью, continue пропустит к следующему DataRow.

45
задан Community 23 May 2017 в 10:31
поделиться

4 ответа

Из документации Python 3 :

sys.intern(string)

Введите строку в таблицу «интернированных» строк и верните интернированная строка - это сама строка или ее копия. Интернирование строк полезно для повышения производительности при поиске по словарю - если ключи в словаре интернированы, а ключ поиска интернирован, сравнение ключей (после хеширования) может быть выполнено путем сравнения указателя вместо сравнения строк. Обычно имена, используемые в Python программы автоматически интернируются, а словари, используемые для хранения атрибуты модуля, класса или экземпляра имеют интернированные ключи.

Интернированные строки не бессмертны; вы должны держать ссылку на возвращает значение intern (), чтобы извлечь из этого пользу.

Пояснение :

Как указано в документации, функция sys.intern предназначена для использования для оптимизации производительности .

Функция sys.intern поддерживает таблицу интернированных строк. Когда вы пытаетесь интернировать строку, функция ищет ее в таблице и:

  1. Если строка не существует (еще не интернирована), функция сохраняет его в таблице и возвращает его из таблицы интернированных строк.

     >>> import sys
    >>> a = sys.intern ('почему панголинам снится пирог с заварным кремом')
    >>> а
    'почему ящеры мечтают о пироге с заварным кремом'
    

    В приведенном выше примере a содержит интернированную строку. Хотя это и не видно, функция sys.intern сохранила строковый объект «почему панголины мечтают о пироге с заварным кремом» в таблице интернированных строк.

  2. Если строка существует (был интернирован) функция возвращает его из таблица интернированных строк.

     >>> b = sys.intern ('почему ящеры мечтают о пироге с заварным кремом')
    >>> б
    'почему ящеры мечтают о пироге с заварным кремом'
    

    Несмотря на то, что это не сразу видно, потому что строка «почему панголины мечтают о пироге с заварным кремом» была интернирована раньше, b теперь содержит тот же строковый объект, что и a .

     >>> b - это
    Правда
    

    Если мы создадим одну и ту же строку без использования intern, мы получим два разных строковых объекта с одинаковым значением.

     >>> c = 'почему панголинам снится пирог с заварным кремом'
    >>> c - это
    Ложь
    >>> c - это b
    Ложь
    

Используя sys.intern , вы гарантируете, что никогда не создадите два строковых объекта с одинаковым значением - когда вы запрашиваете создание второго строкового объекта с тем же значением, что и существующий строковый объект, вы получить ссылку на уже существующий строковый объект. Таким образом вы экономите память . Кроме того, сравнение строковых объектов теперь очень эффективно , потому что оно выполняется путем сравнения адресов памяти двух строковых объектов вместо их содержимого.

63
ответ дан 26 November 2019 в 21:08
поделиться

По сути, стажер ищет (или сохраняет, если нет) строку в наборе интернированных строк, поэтому все интернированные экземпляры будут иметь одну и ту же идентичность. Вы торгуете единовременными затратами на поиск этой строки для более быстрых сравнений (сравнение может возвращать True после простой проверки идентичности вместо необходимости сравнивать каждый символ) и уменьшения использования памяти.

Однако python будет ] автоматически вставляет небольшие строки или похожие на идентификаторы , так что вы можете обнаружить, что не добились улучшения, потому что ваши строки уже интернируются за кулисами. Например:

>>> a = 'abc'; b = 'abc'
>>> a is b
True

В прошлом одним из недостатков было то, что интернированные строки были постоянными. После интернирования строковая память никогда не освобождалась даже после удаления всех ссылок.

18
ответ дан 26 November 2019 в 21:08
поделиться

Возвращает канонический экземпляр строки.

Поэтому, если у вас много одинаковых экземпляров строки, вы экономите память, и, кроме того, вы также можете сравнивать канонические строки по идентичности вместо равенства что быстрее.

4
ответ дан 26 November 2019 в 21:08
поделиться

Они не говорили о ключевом слове intern , потому что в Python такого нет. Они говорили о несущественной встроенной функции intern . Который в py3k был перемещен в sys.intern . Документы содержат исчерпывающее описание.

11
ответ дан 26 November 2019 в 21:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: