Формат хранения строк в Python

Язык программирования Python, появившийся в 1991 году, не мог предсказать будущее и выбрал, оказавшийся не самым лучшим впоследствии, но разумный на тот момент, вариант дефолтной кодировки ASCII. С тех пор много воды утекло. Во-первых, Unicode завоевал мир, во-вторых Python в 3-й версии перешёл на Unicode'ные строки.

Но проблема заключается в том, что на уровне интерпретатора нужно всё равно оперировать байтовыми строками. Самая популярная кодировка UTF-8 является "variable width character encoding", т. е. один символ занимает от 1 до 4 байт (это закодировано в первых битах). Это не подходит для языка, где существует индексация в строке за константное время: str[5].

Внутри для представления строки используется один из трёх вариантов: — 1 байт на символ (Latin-1); — 2 байта (UCS-2); — 4 байта (UCS-4).

То есть даже если в строке все символы помещаются в один байт, но к ней прибавить emoji, то занимаемая память вырастет в 4 раза. К этому стоит добавить и то, что каждая строка на хранение своих метаданных (PyObject с доп. полями, PyTypeObject) расходует 49-80 байт. Есть и микрооптимизации: interning односимвольных строк и строковых констант в программе подразумевает превращение этих объектов в своеобразные singleton'ы.

Почему всё это важно?

Дело в том, что Python испытывает сильный рост популярности, особенно в связи со своим Data Science приложением.

Как известно, одним из основных направлений является анализ текстов на естественных языках NLP. А он, в свою очередь, подразумевает обработку больших текстовых массивов. Именно поэтому стоит отметить, что формат хранения строк может иметь критическое значение в некоторых кейсах.

Если нужны подробности, смотрите здесь и здесь. И не забывайте высказывать своё мнение в комментариях!

Запланируй обучение с выгодой!
Празднуем день программиста вместе! 10% скидка от Otus на курсы! →