Ho bisogno di una classe che funzioni come un dizionario, ma vincolerà il numero totale di coppie chiave / valore che contiene. Ad esempio, supponiamo che il numero massimo di voci sia 1000 e che la classe già contenga 1000 coppie chiave / valore. Se aggiungo una coppia chiave / valore aggiuntiva, la classe dovrebbe rimuovere la coppia chiave-valore che è stata aggiornata meno di recente.
Ecco la mia attuale implementazione in python:
class SizeLimitedDefaultDict(defaultdict):
last_changed = []
def __init__(self, default, max_size, *args, **kwargs):
max_size = 0
super(SizeLimitedDict, self).__init__(default, *args, **kwargs)
def __setitem__(self, key, val):
if len(self) >= self.max_size:
remove_oldest_entry()
super.__setitem__(self, key, val)
update_newest_entry(key)
def update_newest_entry(self, key):
key_index = last_changed.index(key) #will slow it down
last_changed.insert(0, last_changed.pop(key_index))
Questa chiaramente non è una soluzione praticabile. Tutti i guadagni prestazionali del dizionario sono persi. Sto avendo problemi a trovare una soluzione migliore però. Esiste una struttura dei dati che può facilmente conservare le chiavi aggiornate più di recente.