Sarebbe bello avere il pieno supporto per i metodi set per i dizionari (e non il pasticcio diabolico che stiamo ottenendo con Python 3.9) in modo da poter semplicemente "rimuovere" un set di chiavi. Tuttavia, fintanto che non è così e hai un dizionario di grandi dimensioni con potenzialmente un numero elevato di chiavi da rimuovere, potresti voler conoscere le prestazioni. Quindi, ho creato un codice che crea qualcosa di abbastanza grande per confronti significativi: una matrice 100.000 x 1000, quindi 10.000,00 elementi in totale.
from itertools import product
from time import perf_counter
# make a complete worksheet 100000 * 1000
start = perf_counter()
prod = product(range(1, 100000), range(1, 1000))
cells = {(x,y):x for x,y in prod}
print(len(cells))
print(f"Create time {perf_counter()-start:.2f}s")
clock = perf_counter()
# remove everything above row 50,000
keys = product(range(50000, 100000), range(1, 100))
# for x,y in keys:
# del cells[x, y]
for n in map(cells.pop, keys):
pass
print(len(cells))
stop = perf_counter()
print(f"Removal time {stop-clock:.2f}s")
10 milioni di elementi o più non sono insoliti in alcune impostazioni. Confrontando i due metodi sulla mia macchina locale vedo un leggero miglioramento durante l'utilizzo map
e pop
, presumibilmente a causa di un minor numero di chiamate di funzione, ma entrambi richiedono circa 2,5 secondi sulla mia macchina. Ma questo impallidisce rispetto al tempo necessario per creare il dizionario in primo luogo (55s), o includendo i controlli all'interno del ciclo. Se ciò è probabile, è meglio creare un insieme che sia un'intersezione delle chiavi del dizionario e del filtro:
keys = cells.keys() & keys
In sintesi: del
è già fortemente ottimizzato, quindi non preoccuparti di usarlo.