Сколько памяти необходимо для размещения одного символа текста

Обновлено: 21.11.2024

Начиная с Python 3, тип str использует представление Unicode. Строки Unicode могут занимать до 4 байтов на символ в зависимости от кодировки, что иногда может быть дорого с точки зрения памяти.

Чтобы уменьшить потребление памяти и повысить производительность, Python использует три вида внутренних представлений для строк Unicode:

  • 1 байт на символ (кодировка Latin-1)
  • 2 байта на символ (кодировка UCS-2)
  • 4 байта на символ (кодировка UCS-4)

При программировании на Python все строки ведут себя одинаково, и большую часть времени мы не замечаем никакой разницы. Однако разница может быть очень заметной, а иногда и неожиданной при работе с большими объемами текста.

Чтобы увидеть разницу во внутренних представлениях, мы можем использовать функцию sys.getsizeof, которая возвращает размер объекта в байтах:

Как видите, в зависимости от содержимого строки Python использует разные кодировки. Обратите внимание, что каждая строка в Python занимает дополнительные 49-80 байт памяти, где хранится дополнительная информация, такая как хэш, длина, длина в байтах, тип кодировки и флаги строки. Вот почему пустая строка занимает 49 байт памяти.

Мы можем получить кодировку непосредственно из объекта, используя ctypes:

Если все символы в строке умещаются в диапазоне ASCII, они кодируются с использованием 1-байтовой кодировки Latin-1. По сути, Latin-1 представляет первые 256 символов Юникода. Он поддерживает многие латинские языки, такие как английский, шведский, итальянский, норвежский и так далее. Однако он не может хранить нелатинские языки, такие как китайский, японский, иврит, кириллица. Это связано с тем, что их кодовые точки (числовые индексы) определены за пределами 1-байтового (0-255) диапазона.

Большинство популярных естественных языков умещаются в 2-байтовой (UCS-2) кодировке. Кодировка 4 байта (UCS-4) используется, когда строка содержит специальные символы, эмодзи или редкие языки. В стандарте Unicode почти 300 блоков (диапазонов). Вы можете найти 4-байтовые блоки после блока 0xFFFF.

Предположим, у нас есть 10 ГБ текста ASCII, и мы хотим загрузить его в память. Если вы вставите в наш текст один эмодзи, размер строки увеличится в 4 раза! Это огромная разница, с которой вы можете столкнуться на практике при работе с задачами НЛП.

Почему Python не использует внутреннюю кодировку UTF-8

Самой известной и популярной кодировкой Unicode является UTF-8, но Python не использует ее для внутреннего использования.

Когда строка хранится в кодировке UTF-8, каждый символ кодируется с использованием 1–4 байтов в зависимости от символа, который он представляет. Это эффективное кодирование памяти, но у него есть один существенный недостаток. Поскольку каждый символ может иметь разную длину в байтах, нет возможности случайного доступа к отдельному символу по индексу без сканирования строки. Таким образом, для выполнения простой операции, такой как строка [5] с UTF-8, Python должен будет сканировать строку, пока не найдет требуемый символ. Кодировки с фиксированной длиной не имеют такой проблемы, чтобы найти символ по индексу, Python просто умножает номер индекса на длину одного символа (1, 2 или 4 байта).

Интернирование строк

При работе с пустыми строками или строками ASCII из одного символа Python использует интернирование строк. Интернированные строки действуют как синглтоны, то есть если у вас есть две идентичные интернированные строки, в памяти будет только одна их копия.

Как видите, обе части строки указывают на один и тот же адрес в памяти. Это возможно, потому что строки Python неизменяемы.

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

  • имена функций и классов
  • имена переменных
  • имена аргументов
  • константы (все строки, определенные в коде)
  • ключи словарей
  • названия атрибутов

Когда вы нажимаете Enter в Python REPL, ваше выражение компилируется в байт-код. Вот почему все короткие строки в REPL также интернированы.

Этот пример не будет работать, поскольку такие строки не являются константами:

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

Объект unicode состоит почти из 16 000 строк кода на языке C, поэтому существует множество мелких оптимизаций, не упомянутых в этой статье. Если вы хотите узнать больше о Unicode в Python, я бы порекомендовал вам прочитать PEP о строках и проверить код объекта Unicode.

Компьютерная система обычно хранит символы, используя код ASCII.Каждый символ хранится с использованием восьми битов информации, что дает общее количество различных символов 256 (2**8 = 256).

Сколько символов может храниться в бите?

Сколько символов может хранить 16 бит?

В 16-битном целом числе может храниться 2 16 (или 65 536) различных значений. В беззнаковом представлении эти значения представляют собой целые числа от 0 до 65 535; с использованием дополнения до двух возможные значения находятся в диапазоне от −32 768 до 32 767.

Сколько памяти занимает персонаж?

Тип char занимает 1 байт памяти (8 бит) и позволяет выразить в двоичной записи 2^8=256 значений. Тип char может содержать как положительные, так и отрицательные значения.

Является ли символ размером 1 байт?

Поэтому каждый символ может иметь длину 8 бит (1 байт), 16 бит (2 байта), 24 бита (3 байта) или 32 бита (4 байта). Точно так же UTF-16 основан на 16-битных кодовых единицах. Следовательно, каждый символ может быть 16 бит (2 байта) или 32 бита (4 байта). Все UTF включают полный репертуар символов Unicode или набор символов.

Сколько значений может храниться в байте?

Как называется 16 бит?

BYTE — 8 бит без знака. СЛОВО – 16 бит, без знака. DWORD — 32 бита, без знака.

Что такое 16-битное число?

16-разрядный — это компьютерное аппаратное устройство или программа, способная передавать 16 бит данных за раз. Например, ранние компьютерные процессоры (например, 8088 и 80286) были 16-разрядными процессорами, то есть они могли работать с 16-разрядными двоичными числами (десятичные числа до 65 535).

Какой персонаж занимает больше всего памяти?

﷽, вероятно, занимает больше всего места.

Какой минимальный объем памяти для одного персонажа?

1 байт — это минимальное пространство, необходимое для хранения одного символа.

Много ли 1 ГБ памяти?

1 ГБ ОЗУ достаточно для основных операций, таких как просмотр веб-страниц (хотя не ожидайте запуска браузера с десятками открытых вкладок) и электронной почты, а также для обработки текстов и легкого редактирования изображений.

Сколько байтов занимает текстовый символ?

Символы могут иметь от 1 до 6 байт (некоторые из них могут быть не нужны прямо сейчас). Каждый символ UTF-32 имеет 4 байта. UTF-16 использует 16 бит для каждого символа и представляет только часть символов Unicode, называемых BMP (для всех практических целей этого достаточно). Java использует эту кодировку в своих строках.

В чем разница между байтом и символом?

Основное различие между типами данных byte и char заключается в том, что byte используется для хранения необработанных двоичных данных, а другие — для хранения символов или текстовых данных. С точки зрения диапазона, переменная byte может содержать любое значение от -128 до 127, а переменная char может содержать любое значение от 0 до 255.

Сколько байтов составляет буква?

Мы называем 8 бит байтом. В очень распространенной системе ASCII каждая буква алфавита, как заглавная, так и строчная (плюс знаки препинания и некоторые другие символы), соответствует числу от 0 до 255 (например, a=97, b=98 и т. д.), поэтому одна буква может быть выражен одним байтом. Таким образом, слово «Шеннон» занимает 7 байт.

В килобайте 1024 байта, а в мегабайте 1024 килобайта, поэтому документ размером 1 КБ будет содержать 1024 байта данных или 1024 символа текста и другой программной информации, описывающей форматирование документа и другие характеристики, чтобы его можно было открыть. и используется программным приложением, таким как Adobe Acrobat или Microsoft Word.

Изображения представлены на экране в виде пикселей или цветных точек, но могут быть созданы в различных форматах, требующих для хранения файлов самых разных размеров. Для каждого изображения требуется разное количество байтов на пиксель, чтобы определить цвет и расположение каждого пикселя на экране. Черно-белые изображения требуют меньше места, чем изображения в оттенках серого или цветные из-за количества байтов, необходимых для уникального описания каждого цвета. Изображения могут быть выражены во многих форматах, и некоторые большие форматы файлов, такие как изображения TIFF, являются "без потерь" - это означает, что каждый пиксель (точка цвета на вашем экране) получает свой собственный набор байтов для его описания. При равных цветах и ​​других факторах изображение размером 100x100 пикселей (всего = 1000 пикселей) требует примерно в 10 раз больше места для хранения, чем изображение 10x10 пикселей (всего = 100 пикселей). Для сравнения, для представления одного символа текста, занимающего на экране пространство размером 10 x 10 пикселей, обычно требуется всего один байт.

Если вы поместите отсканированные изображения TIFF в файл PDF, вы обнаружите, что объем пространства, необходимый для нового файла PDF, превышает объем места, занимаемого только изображениями TIFF. Это связано с тем, что в файл PDF встроена информация, описывающая, как просматривать и интерпретировать изображения TIFF в средстве просмотра PDF, а также информация (метаданные) для описания самого файла.

Вы обнаружите, что полная страница электронного текста значительно меньше, чем отсканированное изображение TIFF того же текста, когда оно добавляется в файл PDF.

Разница в размере файла txt выше представляет собой то, что добавлено, чтобы сделать его файлом PDF.

Файл PDF, содержащий 8-битный файл TIFF 10x10 с буквой "a" (такой же размер на экране, как и исходный текст)

Мы часто слышим такие слова, как гигабайт (ГБ) и терабайт, но что на самом деле мы можем сделать с таким объемом памяти? На самом базовом уровне вычислений у нас есть биты, которые будут либо 1, либо 0. Байт — это 8 бит. Мы собираемся представить байт в виде этой точки:

4 байта — это память, необходимая для хранения 1 символа, поэтому 1 байт — довольно хорошая отправная точка. На одной странице текста около 500 символов. Мы можем заменить 500 символов на 2000 байт, или около двух килобайт памяти.

Если мы делаем визуальное представление, это 2000 точек.

Это всего 2 килобайта памяти. Всего за 1 страницу текста. Что происходит, когда мы смотрим роман? 40000 слов — это примерно 80 страниц текста или 160 килобайт памяти. Давайте посмотрим, как это выглядит в виде точки.

Вау! Это много точек, но с точки зрения компьютерной памяти это небольшая игра. Перейдем сразу к 1 мегабайту (МБ) памяти. 1 мегабайт — это примерно 6 секунд несжатого аудио, 1 минута аудио в формате MP3 со скоростью 128 кбит/с или 500-страничная книга. Мегабайт равен 1000 килобайт (КБ). Вот как это выглядит в виде точки:

Это 1 миллион байт. Но на самом деле это не так много памяти для нетекстовых приложений. 1 минута аудио на самом деле не доставляет особого удовольствия. 4 мегабайта — это размер картриджа Nintendo 64, CD-ROM — 700 мегабайт (42 минуты несжатого аудио). Гигабайт — это то, с чего мы начинаем переходить к более «стандартному» хранилищу.

На точечных диаграммах при увеличении масштаба можно увидеть отдельные точки на мегабайтах. В гигабайтах это невозможно. Количество точек у нас увеличилось на 1000. Это очень много памяти, в 1 ГБ 1 миллиард байт, а в каждом байте 8 бит, значит, в 1 ГБ 8 миллиардов бит памяти (ВАУ!). Несмотря на все это волнение, 1 ГБ на самом деле не так много памяти, в современных терминах это уже не так. В предыдущем сообщении в блоге я сфотографировал наши USB-накопители.

Много памяти.

Я хотел, чтобы вы могли увеличить каждую отдельную точку, но мой компьютер сильно тормозил в диапазоне 160 КБ, поэтому мне пришлось изменить размер всего.

Каждый из них имеет 4 или 8 гигабайт памяти, поэтому, если вы посмотрите на него, все они имеют точечную диаграмму гигабайта и как минимум в 4 раза больше.
Для сравнения, Google проиндексировал 200 терабайт (1 терабайт равен 1000 гигабайтам) Интернета. По их оценкам, это всего лишь 0,004% всего Интернета, то есть около 5 000 000 терабайт памяти. Пять миллионов терабайт — это 5000 петабайт.

Читайте также: