Sono curioso di sapere come differisce la gestione della memoria tra Bytearray e l'elenco in Python.Differenza tra Bytearray e List in Python
Ho trovato alcune domande come Difference between bytearray and list ma non esattamente rispondendo alla mia domanda.
Domande precisamente ...
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
Come si vede v'è una differenza di dimensioni tra lista/array.array (36 byte per 4 elementi) e una matrice di byte (32 byte per 4 elementi). Qualcuno può spiegarmi perché è questo? Ha senso che l'array di byte occupi 32
byte di memoria per gli elementi 4
(4 * 8 == 32)
, ma come può essere interpretato per elenco e 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
Perché la differenza tra due elementi contigui differiscono da 16
unità qui, quando ciascun elemento occupa solo 8
byte. Significa che ogni puntatore dell'indirizzo di memoria punta a un nibble?
Inoltre, quali sono i criteri per l'allocazione di memoria per un intero? Ho letto che Python assegnerà più memoria in base al valore dell'intero (correggimi se ho torto) come maggiore è il numero più memoria.
Esempio:
>>> y = 10
>>> y.__sizeof__()
14
>>> y = 1000000
>>> y.__sizeof__()
16
>>> y = 10000000000000
>>> y.__sizeof__()
18
ciò che è il criterio che Python alloca la memoria?
E perché Python occupa molta più memoria mentre C
occupa solo 8 byte (la mia è una macchina a 64 bit)? quando sono perfettamente al di sotto dell'intervallo del numero intero (2 ** 64)
?
Metadati:
Python versione:'3.4.3 (v3.4.3:9b73f1c3e601, Feb 24 2015, 22:43:06) [MSC v.1600 32 bit (Intel)]'
macchina arco: 64 bit
PS: Gentilmente mi guida per un buon articolo in cui la gestione della memoria Python è spiegato meglio. Avevo passato quasi un'ora a capire queste cose e ho finito per fare questa domanda in SO. :(
Buona domanda, svalutato. Ehi, sei fortunato: sulla mia macchina Linux Xubuntu a 64 bit CPython 3.4.3 'y .__ sizeof __()' mi dà '28' per' y = 10', lo stesso per 'y = 1M',' 32' per 'y = 10000000000000' – Pynchia
Hi @Pynchia, Mine è un python a 32 bit sebbene la mia macchina sia a 64 bit. Non sono sicuro, ma quella potrebbe essere la ragione. Aspettiamo qualcuno per chiarire. –