Добавить в корзинуПозвонить
Найти в Дзене

Вариации на тему «Hello, World!» в Python. Вариант 8. Интернирование строк

Продолжаем вариации на тему «Hello, World!» в Python. *** import sys a = sys.intern("Hello, World!") print(a) или import sys a = sys.intern('Hello, World!') print(a) Этот код демонстрирует использование механизма интернирования строк в языке Python. Давайте разберём его по частям. 1. import sys В первой строке импортируется встроенный модуль sys. Этот модуль предоставляет доступ к некоторым переменным и функциям, которые тесно взаимодействуют с интерпретатором Python. Одной из таких функций является sys.intern(). 2. a = sys.intern("Hello, World!") • "Hello, World!" – это создание строкового литерала. Когда вы пишете строку таким образом, Python автоматически помещает её в специальную область памяти, называемую "пулом строковых литералов" (string interning pool). Это делается для оптимизации: если одна и та же строка-литерал встречается в программе несколько раз, Python использует один и тот же объект в памяти, экономя ресурсы. • sys.intern() – это функция, которая принудительно доба
Оглавление

Продолжаем вариации на тему «Hello, World!» в Python.

***

Вариант 8. Интернирование строк

import sys

a = sys.intern("Hello, World!")

print(a)

или

import sys

a = sys.intern('Hello, World!')

print(a)

Этот код демонстрирует использование механизма интернирования строк в языке Python. Давайте разберём его по частям.

Детальное объяснение

1. import sys

В первой строке импортируется встроенный модуль sys. Этот модуль предоставляет доступ к некоторым переменным и функциям, которые тесно взаимодействуют с интерпретатором Python. Одной из таких функций является sys.intern().

2. a = sys.intern("Hello, World!")

• "Hello, World!" – это создание строкового литерала. Когда вы пишете строку таким образом, Python автоматически помещает её в специальную область памяти, называемую "пулом строковых литералов" (string interning pool). Это делается для оптимизации: если одна и та же строка-литерал встречается в программе несколько раз, Python использует один и тот же объект в памяти, экономя ресурсы.

• sys.intern() – это функция, которая принудительно добавляет строку в этот пул или возвращает уже существующую там строку, если она есть.

- Если бы мы создали строку динамически, например, так:

s = "".join(["H", "ello, ", "World!"]), то результат (s) не был бы автоматически интернирован. Вызов sys.intern(s) гарантировал бы, что эта новая строка будет добавлена в пул.

В данном конкретном случае строка "Hello, World!" уже является литералом и, скорее всего, уже находится в пуле. Поэтому вызов sys.intern("Hello, World!") просто вернёт ссылку на существующий объект этой строки.

Результат этого вызова присваивается переменной a. Таким образом, теперь и переменная a, и сам литерал "Hello, World!" ссылаются на один и тот же объект в памяти.

3. print(a)

Эта команда выводит значение переменной a на экран. Поскольку a ссылается на строку "Hello, World!", именно этот текст и будет напечатан.

***

Основная цель интернирования – оптимизация использования памяти и ускорение операций сравнения строк.

Интернирование вручную с помощью sys.intern() имеет смысл при работе с большим количеством длинных повторяющихся строк (например, при парсинге больших текстов), где выигрыш в производительности от быстрого сравнения (is) перевешивает затраты на саму операцию интернирования.

Итог

Код создаёт переменную a, которая содержит строку "Hello, World!". Функция sys.intern() здесь используется для демонстрации; в этом простом примере её эффект незаметен. Результатом выполнения кода будет вывод текста:

Hello, World!

***

Компактный вариант

import sys

print(sys.intern('Hello, World!'))

или

import sys

print(sys.intern("Hello, World!"))

-2

Этот код выполняет ту же операцию, что и в предыдущем примере, но делает это более компактно. Давайте разберём его по шагам.

Детальный разбор кода

1. import sys

Эта строка импортирует модуль sys. Модуль sys предоставляет доступ к переменным и функциям, которые тесно связаны с работой самого интерпретатора Python. В данном случае нас интересует одна из его функций – sys.intern().

2. print(sys.intern('Hello, World!'))

Это единственная исполняемая строка кода, которая объединяет три действия:

• Создание строки: 'Hello, World!' – создаётся строковый литерал.

• Интернирование: вызывается функция sys.intern() с этой строкой в качестве аргумента.

• Вывод на печать: результат работы функции sys.intern() немедленно передаётся в функцию print().

Что происходит внутри?

Функция sys.intern(string) гарантирует, что для данного значения строки в памяти будет существовать только один уникальный объект.

Если строка уже находится во внутреннем "пуле" интернированных строк Python (что почти всегда верно для коротких строковых литералов), то sys.intern() просто вернёт ссылку на этот существующий объект.

Если бы строка была создана динамически (например, ''.join(['H', 'ello'])), она не была бы автоматически интернирована. Вызов sys.intern() в этом случае добавил бы её в пул и также вернул бы ссылку на новый, единственный экземпляр этой строки в памяти.

Поскольку 'Hello, World!' является простым литералом, он уже интернирован самим Python. Поэтому вызов sys.intern('Hello, World!') возвращает тот же самый объект, который представляет эта строка.

Этот возвращённый объект (ссылка на строку) сразу же попадает в функцию print(), которая выводит его текстовое представление на экран.

Итог

Код выполняет два действия: принудительно помещает строку 'Hello, World!' в пул уникальных строк (хотя для литерала это и так сделано) и затем печатает эту строку.

Результатом выполнения этого кода будет вывод текста:

Hello, World!

***

Самый компактный вариант

Так как в интерактивном интерпретаторе Python результаты выражений автоматически выводятся в строке, можно функцию print () не использовать:

import sys

sys.intern('Hello, World!')

или

import sys

sys.intern("Hello, World!")

-3

Этот код выполняет операцию интернирования строки, но результат этой операции никак не используется.

Детальный разбор кода

1. import sys

Эта строка импортирует встроенный модуль sys. Он предоставляет доступ к функциям и переменным, которые тесно взаимодействуют с самим интерпретатором Python.

2.
sys.intern('Hello, World!')

Это основная часть кода. Здесь вызывается функция sys.intern().

Что такое интернирование?

В Python интернированные строки – это строки, которые хранятся в памяти в единственном экземпляре. Когда Python встречает интернированную строку, он не создаёт новый объект, а использует ссылку на уже существующий.

Это делается для двух целей:

1. Экономия памяти: если одна и та же строка встречается в программе тысячи раз, она будет храниться в памяти только один раз.
2. Ускорение сравнения: сравнивать идентификаторы объектов (с помощью оператора is) гораздо быстрее, чем сравнивать содержимое строк посимвольно (с помощью оператора ==).

• Как это работает в данном коде?

1. Функция sys.intern() принимает строку 'Hello, World!' в качестве аргумента.

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

3. Поскольку 'Hello!' является коротким строковым литералом, Python автоматически интернирует его при первом же появлении в коде. Поэтому sys.intern() просто найдёт уже существующую строку и вернёт ссылку на неё.

4. Ключевой момент: результат, который возвращает функция sys.intern() (ссылка на строку), не присваивается никакой переменной.

Что происходит при выполнении?
Когда вы запускаете этот код, происходит следующее:

1. Модуль sys импортируется.

2. Вызывается sys.intern('Hello, World!').

3. Функция выполняет свою работу (находит или создаёт интернированную строку).

4. Результат работы функции (ссылка на строку) просто отбрасывается, так как его никто не сохранил.

5. Программа завершается, не произведя никакого видимого вывода.

Итог
Этот код технически выполняет действие (интернирование строки), но не имеет видимого эффекта и не изменяет состояние программы каким-либо заметным образом.

***

Примечания

1. Как правило, «Hello, World!» – это первая программа в учебниках по программированию для начинающих.

2. Традиция использования фразы «Hello, World!» в качестве тестовой программы была введена в книге «Язык программирования Си» Брайана Кернигана и Денниса Ритчи (Brian Kernighan, Dennis Ritchie. The C Programming Language), опубликованной в 1978 году.