Sẽ rất tuyệt nếu có hỗ trợ đầy đủ cho các phương thức thiết lập cho từ điển (và không phải là mớ hỗn độn đáng ghét mà chúng tôi đang gặp phải với Python 3.9) để bạn có thể chỉ cần "loại bỏ" một bộ khóa. Tuy nhiên, miễn là không phải như vậy và bạn có một từ điển lớn với số lượng lớn các khóa cần xóa, bạn có thể muốn biết về hiệu suất. Vì vậy, tôi đã tạo một số mã tạo ra thứ gì đó đủ lớn để so sánh có ý nghĩa: ma trận 100.000 x 1000, tổng cộng 10.000.00 mục.
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 triệu mặt hàng trở lên không phải là bất thường trong một số cài đặt. So sánh hai phương pháp trên máy cục bộ của tôi, tôi thấy có một chút cải thiện khi sử dụng map
và pop
có lẽ là do ít lệnh gọi hàm hơn, nhưng cả hai đều mất khoảng 2,5 giây trên máy của tôi. Nhưng điều này nhạt nhẽo so với thời gian cần thiết để tạo từ điển ngay từ đầu (55 giây), hoặc bao gồm các kiểm tra trong vòng lặp. Nếu điều này có thể xảy ra thì tốt nhất bạn nên tạo một tập hợp là giao điểm của các khóa từ điển và bộ lọc của bạn:
keys = cells.keys() & keys
Tóm lại: del
đã được tối ưu hóa rất nhiều, vì vậy đừng lo lắng về việc sử dụng nó.