2011-09-07 14 views
9

En otros idiomas (por ejemplo, Java), las referencias a objetos pueden ser Strong, Weak, Soft o Phantom (http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html).¿Pueden existir "referencias suaves" en Python?

En Python, las referencias son Fuertes por defecto y el módulo WeakRef permite referencias débiles.

¿Es posible tener "referencias suaves" en Python?

En mi caso particular, tengo una caché de objetos que lleva mucho tiempo crear. A veces puede que no haya referencias a un objeto almacenado en caché, pero no deseo tirar el objeto almacenado en caché si no es necesario (es decir, si la memoria es abundante).

Respuesta

6

Python no ofrece ningún tipo de sabores de referencias, además de difícil (también conocido como fuerte) & débil.

Dicho esto, here es una implementación de software que aumenté hace aproximadamente un año y que he estado utilizando en algunos lugares que necesitaba uno. Lo que proporciona no es bastante referencias suaves reales, pero se acerca a la mayoría de los casos de uso. Es un poco áspero en los bordes, pero es completamente funcional ... aunque depende internamente de algunos recuentos de referencia, lo que significa que probablemente se rompa en todo menos en CPython.

En particular, lo escribí precisamente para un caché de objetos de larga vida caros de crear ... el SoftValueDictionary debería ser exactamente lo que está buscando.

+0

Ese archivo está protegido por derechos de autor, con AFAICS, sin derecho de distribución/reutilización ... –

+3

@JamesBlackburn Mis disculpas por eso, saqué esa secuencia de comandos de mi carpeta de desarrollo sin pensarlo mucho. He actualizado el archivo para incluir una licencia BSD. –

+0

Esta es también una gran respuesta para [mi pregunta] (http://stackoverflow.com/questions/14099804/object-pool-under-memory-constraints). Sin recompilar Python con una implementación diferente del malloc de C, no creo que sea posible algo mejor. – max

0

Otra opción es utilizar un caché que mantenga una cierta cantidad de objetos (por ejemplo, 100) en lugar de calcular explícitamente el consumo de memoria. Cuando se accede a un objeto, se coloca en la parte superior de la memoria caché, si existe, o el objeto en la parte inferior de la memoria caché se reemplaza con el nuevo objeto.

No probado, pero debería funcionar en teoría.

Cuestiones relacionadas