2011-09-07 48 views
9

在其他語言(如Java)中,對象引用可以是Strong,Weak,Soft或Phantom(http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html)。Python中可以存在「軟引用」嗎?

在Python中,引用默認爲Strong,WeakRef模塊允許引用較弱。

是否有可能在Python中具有「軟引用」?

在我的特殊情況下,我有一個耗費時間創建的對象緩存。有時可能沒有對緩存對象的引用,但是如果我不需要(即,如果內存很豐富),我不想拋出緩存的對象。

回答

6

Python本身並不提供任何風格的引用,除了硬(又名強)&弱。

也就是說,here是我在一年左右之前掀起的softref實現,我在一些地方需要使用它。它提供的不是相當於實際的軟引用,但它對於大多數使用情況而言很接近。它的邊緣有點粗糙,但功能完全...儘管它依賴於內部的一些引用計數,這意味着它可能會破壞除CPython之外的任何內容。

特別是,我寫了一個高成本創建長壽命對象的緩存...... SoftValueDictionary應該正是你想要的。

+0

該文件是版權,與AFAICS,沒有分配權利/重複使用... –

+3

@JamesBlackburn我很抱歉,我沒有太多的想法,從我的開發文件夾中拉出該腳本。我已更新文件以包含BSD許可證。 –

+0

這也是一個很好的答案[我的問題](http://stackoverflow.com/questions/14099804/object-pool-under-memory-constraints)。沒有用C的malloc的不同實現重新編譯python,我認爲甚至不可能有更好的東西。 – max

0

另一種選擇是使用保持一定數量的對象(例如100)而不是明確計算其內存消耗的緩存。當一個對象被訪問時,如果它存在,它將被放到緩存的頂部,或者緩存底部的對象被替換爲新對象。

未經測試,但它應該在理論上起作用。

相關問題