2012-02-25 23 views
13

Si consideri il seguente codice:Python: dimensioni di stringhe in memoria

arr = [] 
for (str, id, flag) in some_data: 
    arr.append((str, id, flag)) 

immaginare le stringhe di input che sono 2 caratteri a lungo in media e con 5 caratteri max e some_data avere 1 milione di elementi. Quale sarà il requisito di memoria di una tale struttura?

Potrebbe essere che molta memoria è sprecata per gli archi? Se è così, come posso evitarlo?

risposta

20

In questo caso, poiché le stringhe sono piuttosto brevi e ce ne sono così tante, si risparmia un bel po 'di memoria usando le stringhe intern. Supponendo che ci siano solo lettere minuscole nelle stringhe, questo è 26 * 26 = 676 possibili stringhe, quindi ci devono essere molte ripetizioni in questa lista; intern assicurerà che tali ripetizioni non risultino in oggetti univoci, ma si riferiscono tutti allo stesso oggetto di base.

È possibile che Python abbia già messo a punto brevi stringhe; ma guardando un numero di fonti diverse, sembra che questo dipenda molto dall'implementazione. Quindi chiamare intern in questo caso è probabilmente la strada da percorrere; YMMV.

Come un'elaborazione sul perché questo è molto probabile che per risparmiare memoria, considerare quanto segue:

>>> sys.getsizeof('') 
40 
>>> sys.getsizeof('a') 
41 
>>> sys.getsizeof('ab') 
42 
>>> sys.getsizeof('abc') 
43 

Aggiunta di singoli caratteri di una stringa aggiunge solo un byte alla dimensione della stringa stessa, ma ogni la stringa occupa da sola 40 byte.

+0

Ora ho imparato che Python in generale consuma abbastanza memoria. Come correttamente sottolineato, la lunghezza delle stringhe non è il problema qui, ma la dimensione minima degli oggetti. Sono rimasto un po 'scioccato anche scoprire che la dimensione di un int semplice è di 24 byte (sul sistema a 64 bit). Buono a sapersi ... –

0

Se le stringhe sono così brevi, è probabile che ci sarà un numero significativo di duplicati. L'interning di Python lo ottimizzerà in modo che queste stringhe vengano archiviate una sola volta e il riferimento utilizzi più tiemi, anziché memorizzare più volte la stringa ...

Queste stringhe devono essere internate automaticamente così come sono.

+0

I valori letterali delle stringhe sono internati, ma le stringhe create da altre fonti non sono necessariamente interposte. Non vorrai una chiamata "intern" ogni volta che leggi qualcosa da un file ... – delnan

Problemi correlati