Tôi có một từ điển được tạo bằng cách đọc một loạt tệp hình ảnh. Nó trông như thế này:
files = { 'file1.png': [data...], 'file2.png': [data...], ... 'file1000': [data...]}
Tôi đang cố gắng xử lý những hình ảnh này để xem chúng giống nhau như thế nào. Vấn đề là, với hơn 1000 tệp dữ liệu, việc này sẽ mất rất nhiều thời gian. Tôi chắc chắn rằng tôi có 20 vị trí khác nhau mà tôi có thể tối ưu hóa, nhưng tôi đang cố gắng xem xét từng vị trí một để tìm hiểu cách tối ưu hóa nó tốt hơn.
Phương pháp ban đầu của tôi đã kiểm tra file1 với tất cả các tệp còn lại. Sau đó, tôi đã kiểm tra file2 với tất cả các tệp. Nhưng tôi vẫn thử nghiệm nó với file1. Vì vậy, khi tôi truy cập file1000 trong ví dụ trên, tôi thậm chí không cần kiểm tra bất cứ thứ gì vào thời điểm đó vì nó đã được kiểm tra 999 lần.
Đây là những gì tôi đã thử:
câu trả lời = {}
cho x trong các tập tin:
cho y trong các tập tin:
nếu y không có trong câu trả lời hoặc x không có trong câu trả lời[y]:
if(so sánh(files[x],files[y]) < 0,01):
câu trả lời.setdefault(x, []).append(y)
Điều này không hoạt động vì bây giờ tôi nhận được kết quả đầu ra sai. Hàm so sánh trông như thế này:
rms = math.sqrt(functools.reduce(operator.add,map(lambda a,b: (ab)**2, h1[0], h2[0]))/len(h1[0]))
trả lại rms
Tôi chỉ không muốn đưa phương trình khổng lồ đó vào câu lệnh if.
Có ai có cách hay để so sánh từng phân đoạn dữ liệu của từ điển tệp mà không có sự so sánh chồng chéo không?
biên tập:
Sau khi thử câu trả lời của ShadowRanger, tôi nhận ra rằng có lẽ tôi chưa hiểu hết những gì mình cần. Từ điển câu trả lời ban đầu của tôi trông như thế này:
{ 'file1.png': ['file1.png', 'file23.png', 'file333.png'],
'file2.png': ['file2.png'],
'file3.png': ['file3.png', 'file4.png', 'file5.png'],
'file4.png': ['file3.png', 'file4.png', 'file5.png'],
...}
Bây giờ tôi lưu trữ kết quả trong một tệp như thế này:
tập tin1.png tập tin23.png tập tin33.png
tập tin2.png
tập tin3.png tập tin4.png tập tin5.png
tập tin6.png
...
Tôi nghĩ bằng cách sử dụng kết hợp và chỉ kiểm tra từng tệp riêng lẻ một lần, tôi có thể tiết kiệm rất nhiều thời gian kiểm tra lại các tệp thay vì phải lãng phí thời gian để xóa các câu trả lời trùng lặp. Nhưng theo những gì tôi có thể nói, những sự kết hợp này thực sự làm giảm khả năng tìm thấy kết quả phù hợp của tôi và tôi không chắc tại sao.
Tôi là một lập trình viên xuất sắc, rất giỏi!