2011-09-07 32 views
9

Trong các ngôn ngữ khác (ví dụ: Java), tham chiếu đối tượng có thể Mạnh, Yếu, Mềm hoặc Phantom (http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html).Có thể "tham chiếu mềm" tồn tại trong Python không?

Trong Python, tham chiếu là Mạnh theo mặc định và mô-đun WeakRef cho phép tham chiếu yếu.

Có thể có "tham chiếu mềm" trong Python không?

Trong trường hợp cụ thể của tôi, tôi có bộ nhớ cache các đối tượng tốn nhiều thời gian để tạo. Đôi khi có thể không có tham chiếu đến đối tượng được lưu trong bộ nhớ cache, nhưng tôi không muốn ném đối tượng đã lưu vào bộ nhớ cache nếu tôi không phải (tức là nếu bộ nhớ phong phú).

Trả lời

6

Python không cung cấp bất kỳ hương vị tham chiếu nào ngoài cứng (còn gọi là mạnh) & yếu.

Điều đó nói rằng, here là triển khai softref mà tôi đã bỏ ra một năm hoặc lâu hơn trước đây mà tôi đã sử dụng ở một vài nơi tôi cần. Những gì nó cung cấp không phải là khá các tham chiếu mềm thực sự, nhưng nó gần với hầu hết các trường hợp sử dụng. Đó là một chút thô xung quanh các cạnh, nhưng là đầy đủ chức năng ... mặc dù nó dựa trên một số tài liệu tham khảo đếm nội bộ có nghĩa là nó có thể sẽ phá vỡ bất cứ điều gì ngoại trừ CPython.

Đặc biệt, tôi đã viết chính xác cho bộ nhớ cache các đối tượng tồn tại lâu dài để tạo ra ... SoftValueDictionary phải chính xác những gì bạn đang tìm kiếm.

+0

Tệp đó là bản quyền, với AFAICS, không có quyền phân phối/tái sử dụng ... –

+3

@ JamesBlackburn Xin lỗi vì điều đó, tôi đã kéo tập lệnh đó ra khỏi thư mục dev của mình mà không cần suy nghĩ nhiều. Tôi đã cập nhật tệp để bao gồm giấy phép BSD. –

+0

Đây cũng là một câu trả lời tuyệt vời cho [câu hỏi của tôi] (http://stackoverflow.com/questions/14099804/object-pool-under-memory-constraints). Nếu không biên dịch lại python với một thực hiện khác nhau của malloc của C, tôi không nghĩ rằng bất cứ điều gì tốt hơn là thậm chí có thể. – max

0

Tùy chọn khác là sử dụng bộ nhớ cache duy trì một số lượng đối tượng nhất định (ví dụ: 100) thay vì tính toán mức tiêu thụ bộ nhớ một cách rõ ràng. Khi một đối tượng được truy cập, nó được đặt lên đầu cache nếu nó tồn tại, hoặc đối tượng ở dưới cùng của cache được thay thế bằng đối tượng mới.

Chưa được kiểm tra, nhưng nó sẽ hoạt động theo lý thuyết.

Các vấn đề liên quan