Ответ 1
Почему
28
байт изначально для любого значения, равного1
?
Я считаю, @bgusach ответил, что полностью; Python использует C
structs для представления объектов в мире Python, любых объектов включая int
s:
struct _longobject {
PyObject_VAR_HEAD
digit ob_digit[1];
};
PyObject_VAR_HEAD
- это макрос, который при добавлении добавляет другое поле в struct (поле PyVarObject
, который специально используется для объектов, которые имеют некоторое понятие длины), и ob_digits
- массив, содержащий значение для числа. Размер котельной зависит от этой структуры, для небольших и больших чисел Python.
Почему приращения
4
байтов?
Потому что, когда создается большее число, размер (в байтах) является кратным значению sizeof(digit)
; вы можете увидеть, что в _PyLong_New
, где выделение памяти для нового longobject
выполняется с помощью PyObject_MALLOC
:
/* Number of bytes needed is: offsetof(PyLongObject, ob_digit) +
sizeof(digit)*size. Previous incarnations of this code used
sizeof(PyVarObject) instead of the offsetof, but this risks being
incorrect in the presence of padding between the PyVarObject header
and the digits. */
if (size > (Py_ssize_t)MAX_LONG_DIGITS) {
PyErr_SetString(PyExc_OverflowError,
"too many digits in integer");
return NULL;
}
result = PyObject_MALLOC(offsetof(PyLongObject, ob_digit) +
size*sizeof(digit));
offsetof(PyLongObject, ob_digit)
- это "котельная плита" (в байтах) для длинного объекта, которая не связана с сохранением ее значения.
digit
определяется в файле заголовка, содержащем struct _longobject
как typedef
для uint32
:
typedef uint32_t digit;
и sizeof(uint32_t)
- это 4
байты. То, что количество, на которое вы увидите размер в байтах, увеличивается, когда аргумент size
в _PyLong_New
увеличивается.
Конечно, это именно то, как C
Python решил реализовать его. Это деталь реализации, и поэтому вы не найдете много информации в PEP. Список рассылки python-dev проведет обсуждения по реализации, если вы найдете соответствующий поток:-).
В любом случае, вы можете найти другое поведение в других популярных реализациях, поэтому не принимайте это как должное.