Ce serait bien d'avoir un support complet pour les méthodes set pour les dictionnaires (et non le désordre impie que nous obtenons avec Python 3.9) afin que vous puissiez simplement "supprimer" un ensemble de clés. Cependant, tant que ce n'est pas le cas et que vous disposez d'un dictionnaire volumineux avec potentiellement un grand nombre de clés à supprimer, vous voudrez peut-être en savoir plus sur les performances. J'ai donc créé du code qui crée quelque chose d'assez grand pour des comparaisons significatives: une matrice de 100 000 x 1000, donc 10 000,00 éléments au total.
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 millions d'articles ou plus n'est pas inhabituel dans certains contextes. En comparant les deux méthodes sur ma machine locale, je constate une légère amélioration lors de l'utilisation map
et pop
, probablement à cause du moins grand nombre d'appels de fonction, mais les deux prennent environ 2,5 secondes sur ma machine. Mais cela ne fait rien par rapport au temps nécessaire pour créer le dictionnaire en premier lieu (55 s), ou en incluant des vérifications dans la boucle. Si cela est probable, il est préférable de créer un ensemble qui est une intersection des clés du dictionnaire et de votre filtre:
keys = cells.keys() & keys
En résumé: del
est déjà fortement optimisé, alors ne vous inquiétez pas de l'utiliser.