Alcuni anni fa ho scritto un post sul blog su come scrivere cicli efficienti in termini di memoria in Python che è diventato piuttosto popolare. La risposta positiva mi ha incoraggiato a scrivere una seconda parte, in cui approfondisco ulteriori metodi di ottimizzazione della memoria.
Quando scriviamo codice Python, i loop non sono l’unico posto in cui dobbiamo prestare attenzione all’utilizzo della memoria. Nei progetti relativi ai dati e nello sviluppo di codice orientato agli oggetti, è importante assicurarsi che le nostre classi siano anche efficienti in termini di memoria. Spesso investiamo una notevole quantità di tempo nella progettazione e nella scrittura di classi complesse e intricate, solo per scoprire che hanno prestazioni scadenti nei test o nella produzione a causa della grande quantità di dati che devono trasportare.
Seguendo le tecniche e gli approcci descritti nell’articolo, è possibile creare classi che ottimizzano l’utilizzo della memoria e migliorano le prestazioni generali. Questo post del blog esplora tre tecniche e approcci consigliati per creare classi Python efficienti in termini di memoria.
Utilizzando Python __slots__
dunder, puoi definire esplicitamente gli attributi che una classe potrà mai possedere. Questo generalmente aiuta a ottimizzare l’utilizzo della memoria delle nostre classi evitando la creazione di un dizionario dinamico per l’archiviazione degli attributi.
Per impostazione predefinita, le classi Python memorizzano i propri attributi di istanza in un dizionario privato (__dict__
). Questo dizionario consente molta flessibilità, poiché puoi aggiungere, modificare o eliminare gli attributi della classe in fase di esecuzione. Tuttavia, questa flessibilità di solito va a scapito del sovraccarico della memoria. Ogni istanza della classe dispone di un dizionario che memorizza i nomi e i valori degli attributi come coppie chiave-valore. Quando si usa __slots__
Python riserva solo una quantità fissa di spazio per gli attributi specificati direttamente in ciascuna istanza, invece di utilizzare il dizionario predefinito.
Ecco un esempio di una classe Python che utilizza __slots__
per aumentare l’efficienza della memoria:
Fonte: towardsdatascience.com