Постоянство данных Python

Всякий раз, когда объект Python необходимо сохранить или отправить по сети, он сначала сериализуется. Я предполагаю, что причина в том, что хранение и передача по сети основаны на битах. У меня глупый вопрос, который больше похож на вопрос основ компьютерных наук, чем на вопрос о питоне. Какой формат используют объекты Python, когда они находятся в кеше? Разве они не должны представлять себя как биты? Если это так, почему бы просто не использовать эти биты для хранения или отправки объекта и зачем беспокоиться о сериализации?

2 ответа

Решение

Битовое представление

Один и тот же объект может иметь разные представления в битах на разных машинах:

  • Подумайте о порядке байтов (порядок байтов)
  • и архитектура (32 бита, 64 бита)

Таким образом, представление объекта в битах на машине отправителя может ничего не значить (или, что еще хуже, может означать что-то другое) при получении на получателе.

Возьмем простое число, 1025, в качестве иллюстрации проблемы:

  • На машине Big Endian представление битов:
    • двоичная: 00000000 00000000 00000100 00000001
    • шестнадцатеричное: 0x00000401
  • пока на машине Little Endian:
    • двоичная: 00000001 00000100 00000000 00000000
    • шестнадцатеричный 0x01040000

Вот почему, чтобы понять друг друга, 2 машины должны согласовать соглашение, протокол. Для протокола IP соглашение должно использовать, например, порядок байтов в сети (big-endian).

Подробнее о порядке байтов в этом вопросе

Сериализация (и десериализация)

Мы не можем напрямую отправить объект, лежащий в основе представления битов в сети, по причинам, описанным ранее, но не только.

Объект может сделать ссылку на другой объект, внутри, через указатель (адрес в памяти этого второго объекта). Этот адрес, опять же, зависит от платформы.

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

Pickle модуль документации

Ключевым моментом для ввода / вывода является достижение функциональной совместимости, например, JSON, который вы отправляете по сети, может нуждаться в передаче по протоколу HTTP и последующем анализе с помощью JavaScript. И данные, которые вы сохраняете на диске, могут потребоваться для чтения при следующем запуске Python (другая среда выполнения, распределение памяти, ...).

Но для выполнения кода вы обычно хотите добиться более высокой производительности, чем это было бы возможно при использовании совместимых форматов, например, при использовании адресов местоположения в памяти для доступа к объектным методам, элементам dict,... или максимально возможной оптимизации для кэша процессора.

Чтобы узнать подробнее, как именно реализован python, вы можете взглянуть на одну из реализаций интерпретатора.

Другие вопросы по тегам