Tôi đang xây dựng một lớp học với các từ khóa khác với các giá trị danh sách và phím số nguyên. Thêm giá trị cho từ điển này có vẻ là một nút cổ chai thực sự mặc dù và tôi đã tự hỏi liệu có thể có một số cách để tăng tốc độ mã của tôi.Python: cách tối ưu để thêm vào từ điển có giá trị danh sách
class myClass():
def __init__(self):
self.d = defaultdict(list)
def addValue(self, index, value):
self.d[index].append(value)
Đây có phải là cách tối ưu để thực hiện việc này không? Tôi không thực sự quan tâm đến thứ tự của các giá trị, vì vậy có lẽ có một cấu trúc dữ liệu phù hợp hơn ở đó với một phụ thêm nhanh hơn. Sau đó, một lần nữa, 'phụ thêm' dường như không phải là vấn đề chính, bởi vì nếu tôi chỉ cần nối thêm vào một danh sách trống, mã sẽ nhanh hơn rất nhiều. Tôi đoán đó là tải của danh sách được lưu trữ trước đó mà chiếm hầu hết thời gian?
Tôi phát hiện ra vấn đề không có trong dict, nhưng trong danh sách nối thêm (mặc dù tôi đã tuyên bố khác trong bài đăng gốc của mình, mà tôi xin lỗi). Vấn đề này là do một lỗi trong bộ thu gom rác của Python, được giải thích rõ ràng trên this other question. Vô hiệu hóa gc trước khi thêm tất cả các giá trị và sau đó bật lại nó, tăng tốc quá trình vô cùng!
Thêm các mục vào danh sách và nhận các giá trị từ một đối tượng hoặc một dict không mất thời gian. Để tăng tốc một chương trình bạn tìm thấy nút cổ chai bằng cách lược tả, không phải bằng cách thay đổi các đoạn mã ngẫu nhiên. –
Việc ánh xạ các mục với các khóa hiện có nhanh hơn đáng kể so với việc thêm các giá trị vào các khóa mới? –
Tôi chỉ phát hiện ra rằng vấn đề không phải là trong dict, nhưng trong danh sách phụ thêm (mặc dù tôi tuyên bố khác trong bài gốc của tôi, mà tôi xin lỗi). Sau đó, tôi tìm thấy câu trả lời cho câu hỏi của mình trên http://stackoverflow.com/questions/2473783/is-there-a-way-to-circumvent-python-list-append-becoming-progressively-slower. Vì tôi mới vào trang web này, tôi không biết quy trình chuẩn là gì trong trường hợp này: tôi có nên xóa bài đăng gốc của mình không? Hoặc thêm các chi tiết ở trên và trả lời cho bài đăng? – niefpaarschoenen