La serializzazione (o serialization) è un processo fondamentale in Python che consiste nella trasformazione di oggetti in un formato che può essere facilmente salvato, trasportato o recuperato in un secondo momento. Una delle librerie più potenti e semplici da usare per la serializzazione, soprattutto quando si lavora con oggetti di grandi dimensioni, è Joblib.
In questo post vedremo:
- Cos’è Joblib e quando utilizzarlo
- Come serializzare e deserializzare oggetti Python con Joblib
- Vantaggi rispetto ad altri metodi (come Pickle)
- Casi d’uso ed esempi concreti
- Migliori pratiche e consigli utili
Cos’è Joblib?
Joblib è una libreria Python progettata per facilitare il salvataggio e il caricamento di oggetti Python, specialmente quelli pesanti (come modelli di machine learning, dataset, array NumPy e pipeline complesse). È particolarmente efficace per:
- Serializzare grandi dataset e modelli complessi
- Cache di risultati intermedi (memoizzazione)
- Parallelizzare computazioni pesanti
Joblib utilizza internamente il protocollo Pickle ma aggiunge numerose ottimizzazioni, come la compressione automatica e una maggiore efficienza.
Installare Joblib
Joblib può essere installato facilmente tramite pip:
Serializzare e Deserializzare oggetti con Joblib
Ecco una sintassi semplice per la serializzazione e deserializzazione con Joblib:
Salvataggio di un oggetto (serializzazione):
import joblib
# Oggetto Python da serializzare (esempio un modello addestrato)
modello = {"nome": "modello_esempio", "versione": 1.0}
# Serializzazione e salvataggio
joblib.dump(modello, 'modello.joblib')
Caricamento di un oggetto (deserializzazione):
import joblib
# Caricamento dell'oggetto serializzato
modello_caricato = joblib.load('modello.joblib')
print(modello_caricato)
# Output: {'nome': 'modello_esempio', 'versione': 1.0}
Serializzare modelli Machine Learning con Joblib (esempio pratico)
Joblib è spesso usato con librerie come scikit-learn per salvare modelli addestrati. Ecco un esempio completo:
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
import joblib
# Caricamento dataset e training modello
iris = load_iris()
X, y = iris.data, iris.target
clf = RandomForestClassifier()
clf.fit(X, y)
# Salvataggio modello
joblib.dump(clf, 'random_forest_iris.joblib')
# Caricamento modello
clf_caricato = joblib.load('random_forest_iris.joblib')
# Test del modello caricato
predizioni = clf_caricato.predict(X[:5])
print(predizioni)
Comprimere oggetti con Joblib
Joblib permette anche di comprimere automaticamente gli oggetti serializzati:
# Compressione gzip
joblib.dump(clf, 'random_forest_iris_compressed.joblib', compress='gzip')
# Compressione rapida con protocollo lz4 (richiede lz4 installato)
# pip install lz4
joblib.dump(clf, 'random_forest_iris_lz4.joblib', compress='lz4')
La compressione è utile per ridurre lo spazio occupato su disco, soprattutto per dataset molto grandi o modelli complessi.
Joblib vs Pickle: Quale scegliere?
Joblib si basa sul protocollo Pickle, ma introduce alcuni miglioramenti significativi:
Caratteristica |
Pickle standard |
Joblib |
Velocità serializzazione |
✅ Rapido per piccoli oggetti |
✅ Molto più efficiente per grandi oggetti |
Compressione automatica |
❌ No |
✅ Sì |
Supporto multi-core/parallelizzazione |
❌ No |
✅ Sì |
Cache dei risultati intermedi |
❌ No |
✅ Sì |
Joblib è quindi raccomandato quando lavori con dataset o modelli voluminosi.
Gestire Eccezioni e Errori con Joblib
Quando deserializzi oggetti, è buona norma gestire eccezioni:
import joblib
try:
modello = joblib.load('file_non_esistente.joblib')
except FileNotFoundError:
print("Il file non è stato trovato!")
except Exception as e:
print(f"Errore durante il caricamento: {e}")
Best Practices e Suggerimenti
Ecco alcune raccomandazioni utili per l’uso di Joblib:
- Usa nomi chiari e descrittivi per i file (
modello_rf_v1.joblib
invece di m.joblib
)
- Documenta cosa contiene ogni file serializzato (ad esempio, tramite README o commenti nello script)
- Utilizza la compressione per oggetti grandi (ma valuta il trade-off tempo/risparmio spazio)
- Mantieni la retrocompatibilità (evita di serializzare oggetti che cambiano troppo frequentemente)
Conclusione
Joblib rappresenta una soluzione potente, facile e affidabile per serializzare oggetti Python complessi, specialmente nel contesto del machine learning e della gestione dei dati scientifici. Con Joblib puoi aumentare la produttività, ridurre tempi e spazio di archiviazione e rendere più organizzato e performante il tuo codice.
Per approfondire ulteriormente, consulta: