在其他语言(例如 Java)中,对象引用可以是强、弱、软或幻象(http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html)。
在 Python 中,默认情况下引用是强引用,并且 WeakRef 模块允许弱引用。
是否可以在 Python 中使用“软引用”?
在我的特定情况下,我有一个创建耗时的对象缓存。有时可能没有对缓存对象的引用,但如果我不需要(即如果内存充足),我不想丢弃缓存对象。
在其他语言(例如 Java)中,对象引用可以是强、弱、软或幻象(http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html)。
在 Python 中,默认情况下引用是强引用,并且 WeakRef 模块允许弱引用。
是否可以在 Python 中使用“软引用”?
在我的特定情况下,我有一个创建耗时的对象缓存。有时可能没有对缓存对象的引用,但如果我不需要(即如果内存充足),我不想丢弃缓存对象。
除了硬(又名强)和弱之外,Python 本身不提供任何类型的引用。
也就是说,这是我大约一年前推出的一个 softref 实现,我一直在一些我需要的地方使用它。它提供的并不是真正的软引用,但它对于大多数用例来说都很接近。它的边缘有点粗糙,但功能齐全......虽然它在内部依赖于一些引用计数,这意味着它可能会在除 CPython 之外的任何东西上中断。
特别是,我为创建昂贵的长寿命对象的缓存而编写了它......这SoftValueDictionary
应该正是您正在寻找的东西。
另一种选择是使用缓存来维护一定数量的对象(例如 100 个),而不是显式计算它们的内存消耗。当一个对象被访问时,如果它存在则将它放到缓存的顶部,或者将缓存底部的对象替换为新的对象。
未经测试,但它应该在理论上有效。