Python Является ли sys.getsizeof памяти возврата используемой динамическим массивом c, если аргумент является объектом списка - PullRequest
0 голосов
/ 03 марта 2020

Список в python реализован динамическим массивом c. Таким образом, в списке объектов есть указатель, который указывает на массив в куче. Исходный код здесь .

typedef struct {
PyObject_VAR_HEAD
/* Vector of pointers to list elements.  list[0] is ob_item[0], etc. */
PyObject **ob_item;

/* ob_item contains space for 'allocated' elements.  The number
 * currently in use is ob_size.
 * Invariants:
 *     0 <= ob_size <= allocated
 *     len(list) == ob_size
 *     ob_item == NULL implies ob_size == allocated == 0
 * list.sort() temporarily sets allocated to -1 to detect mutations.
 *
 * Items must normally not be NULL, except during construction when
 * the list is not yet visible outside the function that builds it.
 */
Py_ssize_t allocated;

} PyListObject;

Поэтому я думаю, что sys.getsizeof вернет постоянное значение независимо от того, сколько элементов в списке поскольку объект списка содержит только один указатель, один MACRO (PyObject_HEAD Py_ssize_t ob_size;) и одно целое число.

Однако я обнаружил, что возвращаемое значение sys.getsizeof в списке увеличивается с увеличением количества элементов в списке увеличено.

Пример:

sys.getsizeof([])                         #returns 72
sys.getsizeof([1])                        #returns 80
sys.getsizeof([x for x in xrange(1024)])  #returns 9032

Почему возвращаемое значение sys.getsizeof в списке не является постоянным значением?

...