Sözlükler için set metotları için tam desteğe sahip olmak güzel olurdu (Python 3.9 ile karşılaştığımız kutsal karmaşa değil), böylece bir anahtar setini basitçe "kaldırabilirsiniz". Ancak, durum böyle olmadığı ve kaldırılması gereken çok sayıda anahtarın bulunduğu büyük bir sözlüğünüz olduğu sürece, performans hakkında bilgi edinmek isteyebilirsiniz. Bu yüzden, anlamlı karşılaştırmalar için yeterince büyük bir şey oluşturan bir kod yarattım: 100.000 x 1000 matris, yani toplamda 10.000,00 öğe.
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")
Bazı ayarlarda 10 milyon veya daha fazla öğe alışılmadık değildir. Yerel makinemdeki iki yöntemi karşılaştırdığımda map
ve pop
muhtemelen daha az işlev çağrısı nedeniyle ve kullanırken küçük bir gelişme görüyorum , ancak her ikisi de makinemde yaklaşık 2,5 saniye sürüyor. Ancak bu, sözlüğü ilk etapta (55s) oluşturmak veya döngü içinde kontroller dahil etmek için gereken süreye kıyasla sönük kalır. Bu büyük olasılıkla, sözlük tuşları ile filtrenizin kesişim noktası olan bir küme oluşturmak en iyisidir:
keys = cells.keys() & keys
Özetle: del
zaten yoğun bir şekilde optimize edilmiştir, bu nedenle onu kullanma konusunda endişelenmeyin.