Большой размер типов данных. Python

Общий вопрос:

Почему в Python объекты "привычных" типов данных столько весят?

>>> sys.getsizeof(int())
12
>>> sys.getsizeof(bool())
12
>>> sys.getsizeof(str())
25
>>> sys.getsizeof("")
25
>>> sys.getsizeof(" ")
26
>>> sys.getsizeof(float())
16

То есть интересует какие именно элементы класса занимают лишнюю память.

Конкретные вопросы:

  1. Где находятся конструкторы классов int, str, bool... (директория/файл)?
  2. В чем смысл bool, если он весит столько же, сколько и int? При проверке условия if cond: ... после приведения типов type(cond) == bool или int?

PS Возможно вопросы туповаты, но уж очень любопытно) Быть может кто-то знает секреты ресурсоемкой питоновской магии.


Ответы (1 шт):

Автор решения: eri

12 байт от переменной занимает структура PyVarObject. Но в зависимости от типа там может быть ещё куча указателей.

int в Питоне имеет динамический размер, питон подбирает что использовать (int32,int64) в зависимости от величины

>>> sys.getsizeof(9223372036854775807)
36
>>> sys.getsizeof(1)
28
>>> sys.getsizeof(0)
24

bool занимает 4 байта так как это наследования типа из Си. Плюс PyTypeObject.

>>> sys.getsizeof(True)
28

Также как и в Си boolean это int.

>>> True==1
True
>>> True+True
2
>>> 

Не char а int потому, что из-за выравнивания памяти в языке и в процессоре int работает быстрее других типов.

У меня 64битная ОС, поэтому указатели 8 байтные (24 вместо 12).

→ Ссылка