Мне любопытно узнать, как управление памятью отличается от Bytearray и списка в Python.Разница между Bytearray и List в Python
Я нашел несколько вопросов, таких как Difference between bytearray and list, но точно не ответил на мой вопрос.
Мой вопрос точно ...
from array import array
>>> x = array("B", (1,2,3,4))
>>> x.__sizeof__()
36
>>> y = bytearray((1,2,3,4))
>>> y.__sizeof__()
32
>>> z = [1,2,3,4]
>>> z.__sizeof__()
36
Как мы можем видеть, что есть разница в размерах между список/array.array (36 байт для 4-х элементов) и массив байт (32 байт для 4-х элементов). Может кто-нибудь объяснить мне, почему это? Для байтового массива имеет смысл, что он занимает 32
байт памяти для 4
элементов (4 * 8 == 32)
, но как это можно интерпретировать для списка и array.array?
# Lets take the case of bytearray (which makes more sense to me at least :p)
for i in y:
print(i, ": ", id(i))
1 : 499962320
2 : 499962336 #diff is 16 units
3 : 499962352 #diff is 16 units
4 : 499962368 #diff is 16 units
Почему разница между двумя смежными элементами отличаются 16
единицами здесь, когда каждый элемент занимает всего 8
байт. Означает ли это, что каждый указатель адреса памяти указывает на кусок?
Также каковы критерии распределения памяти для целого числа? Я читал, что Python назначит больше памяти на основе значения целого числа (исправьте меня, если я ошибаюсь), так как чем больше число, тем больше памяти.
Например:
>>> y = 10
>>> y.__sizeof__()
14
>>> y = 1000000
>>> y.__sizeof__()
16
>>> y = 10000000000000
>>> y.__sizeof__()
18
что критерии, которые Python выделяет память?
И почему Python занимает гораздо больше памяти, а C
занимает всего 8 байтов (мой 64-разрядный компьютер)? когда они полностью находятся в диапазоне целых чисел (2 ** 64)
?
Метаданные:
Python версии:'3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)]'
машина арка: 64-разрядное
PS: Просьба направить меня на хорошую статью, где управление памятью Питон объяснил лучше. Я потратил почти час, чтобы понять эти вещи, и в конечном итоге спросил этот Вопрос в SO. :(
Хороший вопрос, рекомендуется. Эй, вам повезло: на моей 64-разрядной машине Linux Xubuntu CPython 3.4.3 'y .__ sizeof __()' дает мне '28' для' y = 10', то же самое для 'y = 1M',' 32' for 'y = 10000000000000' – Pynchia
Привет @Pynchia, Mine - это 32-разрядный питон, хотя моя машина - 64 бит. Я не уверен, но это может быть причиной. Дождитесь, пока кто-нибудь уточнит. –