Python中是否存在“软引用”?

时间:2011-09-07 09:13:19

标签: python reference soft-references

在其他语言(例如Java)中,对象引用可以是Strong,Weak,Soft或Phantom(http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html)。

在Python中,默认情况下引用为Strong,而WeakRef模块允许弱引用。

是否可以在Python中使用“软引用”?

在我的特定情况下,我有一个对象的缓存,这些对象的创建非常耗时。有时候可能没有对缓存对象的引用,但是如果我不需要(例如,如果内存很多),我不想抛弃缓存的对象。

2 个答案:

答案 0 :(得分:6)

Python本身并不提供任何风格的引用,除了硬(又名强)和&弱。

那就是说,here是我在大约一年前掀起的一个softref实现,我在一些我需要的地方使用过。它提供的不是相当实际的软引用,但它在大多数用例中都很接近。它的边缘有点粗糙,但功能齐全......虽然它依赖于内部的一些引用计数,这意味着除了CPython之外它可能会破坏任何东西。

特别是,我写的正是为了创建一个昂贵的长期存在的对象的缓存... SoftValueDictionary应该正是你正在寻找的。

答案 1 :(得分:0)

另一种选择是使用维护一定数量对象(例如100)的缓存,而不是显式计算它们的内存消耗。访问对象时,如果存在对象,则将其置于缓存顶部,或者将缓存底部的对象替换为新对象。

未经测试,但它应该在理论上有效。