Byłoby miło mieć pełne wsparcie dla metod ustawiania dla słowników (a nie przeklętego bałaganu, który dostajemy w Pythonie 3.9), abyś mógł po prostu „usunąć” zestaw kluczy. Jeśli jednak tak nie jest i masz duży słownik z potencjalnie dużą liczbą kluczy do usunięcia, możesz chcieć wiedzieć o wydajności. Stworzyłem więc kod, który tworzy coś wystarczająco dużego do znaczących porównań: macierz 100 000 x 1000, czyli łącznie 10 000,00 elementów.
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 milionów lub więcej elementów nie jest niczym niezwykłym w niektórych sytuacjach. Porównując dwie metody na moim komputerze lokalnym, widzę niewielką poprawę podczas używania map
i pop
prawdopodobnie z powodu mniejszej liczby wywołań funkcji, ale obie zajmują około 2,5 sekundy na moim komputerze. Ale to blednie w porównaniu z czasem potrzebnym do utworzenia słownika w pierwszej kolejności (55 s) lub z uwzględnieniem sprawdzeń w pętli. Jeśli jest to prawdopodobne, najlepiej jest utworzyć zestaw będący przecięciem kluczy słownika i filtru:
keys = cells.keys() & keys
Podsumowując: del
jest już mocno zoptymalizowany, więc nie martw się o jego używanie.