Từ điển là một biểu diễn cụ thể tốt cho các tập hợp trong Python, vì vậy các phép toán như giao điểm là phổ biến. Giả sử bạn có hai từ điển [nhưng giả sử rằng mỗi từ điển chứa hàng nghìn mục]
some_dict = { 'zope':'zzz', 'python':'rocks' } another_dict = { 'python':'rocks', 'perl':'$' }
Đây là một cách tồi để tìm giao lộ của họ rất chậm
intersect = [] for item in some_dict.keys[ ]: if item in another_dict.keys[ ]: intersect.append[item] print "Intersects:", intersect
Và đây là một cách hay, đơn giản và nhanh chóng
intersect = [] for item in some_dict.keys[ ]: if another_dict.has_key[item]: intersect.append[item] print "Intersects:", intersect
Trong Python 2. 2, sau đây là thanh lịch và thậm chí nhanh hơn
print "Intersects:", [k for k in some_dict if k in another_dict]
Và đây là một cách tiếp cận thay thế giúp giảm tốc độ, cho Python 1. 5. 2 trở lên
print "Intersects:", filter[another_dict.has_key, some_dict.keys[]]
Phương thức
print "Intersects:", [k for k in some_dict if k in another_dict]2 tạo danh sách tất cả các khóa của từ điển. Có thể khá hấp dẫn khi rơi vào cái bẫy chỉ sử dụng
intersect = [] for item in some_dict.keys[ ]: if item in another_dict.keys[ ]: intersect.append[item] print "Intersects:", intersect0, với danh sách này ở phía bên tay phải, để kiểm tra tư cách thành viên. Tuy nhiên, trong ví dụ đầu tiên, bạn đang lặp qua tất cả
intersect = [] for item in some_dict.keys[ ]: if item in another_dict.keys[ ]: intersect.append[item] print "Intersects:", intersect1, sau đó mỗi lần lặp qua tất cả
intersect = [] for item in some_dict.keys[ ]: if item in another_dict.keys[ ]: intersect.append[item] print "Intersects:", intersect2. Nếu
intersect = [] for item in some_dict.keys[ ]: if item in another_dict.keys[ ]: intersect.append[item] print "Intersects:", intersect1 có N1 mục và
intersect = [] for item in some_dict.keys[ ]: if item in another_dict.keys[ ]: intersect.append[item] print "Intersects:", intersect2 có N2 mục, thao tác giao cắt của bạn sẽ có thời gian tính toán tỷ lệ thuận với tích của N1x N2. [O[N1x N2] là ký hiệu khoa học máy tính phổ biến để biểu thị điều này. ]
Bằng cách sử dụng phương pháp
intersect = [] for item in some_dict.keys[ ]: if item in another_dict.keys[ ]: intersect.append[item] print "Intersects:", intersect5, bạn không lặp lại trên
intersect = [] for item in some_dict.keys[ ]: if item in another_dict.keys[ ]: intersect.append[item] print "Intersects:", intersect2 nữa mà thay vào đó kiểm tra khóa trong bảng băm của từ điển. Thời gian xử lý cho
intersect = [] for item in some_dict.keys[ ]: if item in another_dict.keys[ ]: intersect.append[item] print "Intersects:", intersect5 về cơ bản không phụ thuộc vào kích thước từ điển, vì vậy cách tiếp cận thứ hai là O[N1]. Sự khác biệt là khá đáng kể đối với các từ điển lớn. Nếu hai cuốn từ điển có kích thước rất khác nhau, điều quan trọng là sử dụng cuốn từ điển nhỏ hơn đóng vai trò là
intersect = [] for item in some_dict.keys[ ]: if item in another_dict.keys[ ]: intersect.append[item] print "Intersects:", intersect1, trong khi cuốn từ điển lớn hơn đóng vai trò là
intersect = [] for item in some_dict.keys[ ]: if item in another_dict.keys[ ]: intersect.append[item] print "Intersects:", intersect2 [i. e. , lặp lại các phím của từ điển nhỏ hơn, do đó chọn N1 nhỏ hơn]
Trăn 2. 2 cho phép bạn lặp trực tiếp trên các khóa của từ điển, với câu lệnh
intersect = [] for item in some_dict.keys[ ]: if item in another_dict.keys[ ]: intersect.append[item] print "Intersects:", intersect5
Bạn có thể kiểm tra tư cách thành viên với thanh lịch không kém
intersect = [] for item in some_dict.keys[ ]: if item in another_dict.keys[ ]: intersect.append[item] print "Intersects:", intersect6
thay vì tương đương nhưng kém hơn về mặt cú pháp
intersect = [] for item in some_dict.keys[ ]: if another_dict.has_key[item]: intersect.append[item] print "Intersects:", intersect0. Kết hợp hai cải tiến nhỏ nhưng hay này của Python 2. 2 với ký hiệu hiểu danh sách được giới thiệu trong Python 2. 0, chúng tôi kết thúc với một cách tiếp cận rất tao nhã, đồng thời ngắn gọn, rõ ràng và khá nhanh chóng
Tuy nhiên, cách tiếp cận nhanh nhất là cách sử dụng
intersect = [] for item in some_dict.keys[ ]: if another_dict.has_key[item]: intersect.append[item] print "Intersects:", intersect1 với phương pháp ràng buộc
intersect = [] for item in some_dict.keys[ ]: if another_dict.has_key[item]: intersect.append[item] print "Intersects:", intersect2 trong danh sách
intersect = [] for item in some_dict.keys[ ]: if another_dict.has_key[item]: intersect.append[item] print "Intersects:", intersect3. Một giao điểm điển hình của hai từ điển 500 mục với 50% trùng lặp, trên một máy giá rẻ điển hình ngày nay [AMD Athlon 1. 4GHz, RAM DDR2100, Mandrake Linux 8. 1], mất 710 micro giây khi sử dụng
intersect = [] for item in some_dict.keys[ ]: if item in another_dict.keys[ ]: intersect.append[item] print "Intersects:", intersect5, 450 micro giây khi sử dụng Python 2. 2 và 280 micro giây sử dụng cách dựa trên
intersect = [] for item in some_dict.keys[ ]: if another_dict.has_key[item]: intersect.append[item] print "Intersects:", intersect1. Mặc dù những khác biệt về tốc độ này hầu như là đáng kể, nhưng chúng không đáng kể so với thời gian của đoạn đường xấu, theo đó một giao lộ điển hình mất 22.600 micro giây—dài hơn 30 lần so với cách đơn giản và 80 lần so với cách dựa trên
intersect = [] for item in some_dict.keys[ ]: if another_dict.has_key[item]: intersect.append[item] print "Intersects:", intersect1. Đây là mã thời gian, cho thấy một ví dụ điển hình về cách một người tiến hành đo tốc độ tương đối của các cấu trúc Python tương đương
intersect = [] for item in some_dict.keys[ ]: if another_dict.has_key[item]: intersect.append[item] print "Intersects:", intersect4
Bạn có thể lưu mã này vào một tệp
intersect = [] for item in some_dict.keys[ ]: if another_dict.has_key[item]: intersect.append[item] print "Intersects:", intersect7 và chạy nó [tất nhiên là một vài lần, trên một máy không hoạt động] với
intersect = [] for item in some_dict.keys[ ]: if another_dict.has_key[item]: intersect.append[item] print "Intersects:", intersect8 để kiểm tra xem thời gian của các cấu trúc khác nhau so sánh như thế nào trên bất kỳ máy cụ thể nào mà bạn quan tâm. [Lưu ý rằng tập lệnh này yêu cầu Python 2. 2 hoặc muộn hơn. ] Định thời gian cho các đoạn mã khác nhau để tìm hiểu tốc độ tương đối của chúng so sánh như thế nào là một kỹ thuật quan trọng của Python, vì trực giác là một hướng dẫn nổi tiếng không đáng tin cậy đối với các phép so sánh tốc độ tương đối như vậy. Để biết hướng dẫn chi tiết và tổng quát về cách tính thời gian, hãy xem phần giới thiệu của Chương 17
Khi có thể áp dụng mà không cần phải sử dụng biểu mẫu
intersect = [] for item in some_dict.keys[ ]: if another_dict.has_key[item]: intersect.append[item] print "Intersects:", intersect9 hoặc chức năng được viết đặc biệt,
intersect = [] for item in some_dict.keys[ ]: if another_dict.has_key[item]: intersect.append[item] print "Intersects:", intersect1,
print "Intersects:", [k for k in some_dict if k in another_dict]1 và
print "Intersects:", [k for k in some_dict if k in another_dict]2 thường đưa ra giải pháp nhanh nhất cho bất kỳ vấn đề nào. Tất nhiên, một Pythonista thông minh chỉ quan tâm đến tốc độ đối với rất, rất ít thao tác mà tốc độ thực sự quan trọng hơn sự rõ ràng, đơn giản và sang trọng. Nhưng những phần mềm tích hợp này cũng khá thanh lịch theo cách riêng của chúng
Chúng tôi không có một công thức riêng cho việc kết hợp các phím của hai từ điển, nhưng đó là bởi vì nhiệm vụ này thậm chí còn dễ dàng hơn, nhờ phương pháp
print "Intersects:", [k for k in some_dict if k in another_dict]3 của từ điển