2009-11-05 16 views
8

Ho bisogno di una lista molto ampia, e sto cercando di capire quanto posso fare in modo che si adatti ancora a 1-2 GB di RAM. Sto usando l'implementazione CPython, su 64 bit (x86_64).Python: quanto spazio occupa ciascun elemento di una lista?

Modifica: grazie alla risposta di bua, ho compilato alcune delle risposte più concrete.

Qual è l'utilizzo dello spazio (memoria) di (in byte):

  • lista stessa
    • sys.getsizeof([]) == 72
  • ogni voce dell'elenco (non inclusi i dati)
    • sys.getsizeof([0, 1, 2, 3]) == 104, quindi 8 byte oltre testa per voce.
  • i dati se è un numero intero
    • sys.getsizeof(2**62) == 24 (ma varia a seconda delle dimensioni integer)
    • sys.getsizeof(2**63) == 40
    • sys.getsizeof(2**128) == 48
    • sys.getsizeof(2**256) == 66
  • i dati se è un oggetto (sizeof(Pyobject) immagino))
    • sys.getsizeof(C()) == 72 (C è un oggetto user-spazio vuoto)

Se è possibile condividere i dati più generali sulle dimensioni osservati, che sarebbe grande. Ad esempio:

  • Ci sono casi speciali (penso che i valori immutabili potrebbero essere condivisi, quindi forse un elenco di bool non occupa spazio aggiuntivo per i dati)?
  • Forse gli elenchi di piccole dimensioni richiedono l'overhead di X byte ma gli elenchi di grandi dimensioni richiedono un sovraccarico di byte Y?
+0

potresti voler rispondere alla tua domanda con le informazioni che hai aggiunto, tuttavia è ovvio che bua ha risposto alla parte principale della tua domanda e EOL ha fornito un modo per prevedere in modo più accurato e inserire più elementi nella RAM. –

+0

Questo è stato pubblicato come risposta che doveva essere rimossa come una sola risposta di collegamento, ma sembra che potrebbe essere utile, quindi la sto postando come commento. Il modulo Python della settimana ha pubblicato un articolo su Python Memory Management, che puoi visualizzare qui: http://pymotw.com/2/sys/limits.html – ArtOfWarfare

risposta

9

punto di inizio:

>>> import sys 
>>> a=list() 
>>> type(a) 
<type 'list'> 
>>> sys.getsizeof(a) 
36 
>>> b=1 
>>> type(b) 
<type 'int'> 
>>> sys.getsizeof(b) 
12 

e in pitone aiuto:

>>> help(sys.getsizeof) 
Help on built-in function getsizeof in module sys: 

getsizeof(...) 
    getsizeof(object, default) -> int 

    Return the size of object in bytes. 
6

Se volete elenchi di valori numerici, il modulo standard array fornisce matrici ottimizzate (che hanno un metodo append).

Il modulo non standard, ma comunemente utilizzato, NumPy offre array efficienti di dimensioni fisse.

+1

+1, per il modulo array –

Problemi correlati