2011-09-07 18 views
9

In altre lingue (ad es. Java), i riferimenti agli oggetti possono essere Forte, Debole, Morbido o Phantom (http://weblogs.java.net/blog/enicholas/archive/2006/05/understanding_w.html).Can "riferimenti software" esistono in Python?

In Python, i riferimenti sono Forti per impostazione predefinita e il modulo WeakRef consente riferimenti deboli.

È possibile avere "riferimenti software" in Python?

Nel mio caso particolare, ho una cache di oggetti che richiede molto tempo per essere creata. A volte potrebbe non esserci riferimento a un oggetto memorizzato nella cache, ma non voglio buttare via l'oggetto memorizzato nella cache se non è necessario (ad esempio se la memoria è abbondante).

risposta

6

Python non offre in modo nativo alcun tipo di riferimento oltre a hard (aka strong) & debole.

Detto questo, here è un'implementazione morbida che ho montato un anno fa circa, che ho utilizzato in alcuni punti di cui avevo bisogno. Quello che fornisce non è piuttosto riferimenti soft reali, ma si avvicina per la maggior parte dei casi d'uso. È un po 'approssimativo ai bordi, ma è perfettamente funzionante ... anche se si basa su un conteggio dei riferimenti interno che significa che probabilmente si interromperà su qualsiasi cosa eccetto CPython.

In particolare, l'ho scritto precisamente per una cache di oggetti longevi costosi da creare ... il SoftValueDictionary dovrebbe essere esattamente quello che stai cercando.

+0

Quel file è copyright, con AFAICS, nessun diritto di distribuzione/riutilizzo ... –

+3

@JamesBlackburn Le mie scuse per questo, ho tirato fuori quello script dalla cartella dev senza pensarci troppo. Ho aggiornato il file per includere una licenza BSD. –

+0

Questa è anche un'ottima risposta a [la mia domanda] (http://stackoverflow.com/questions/14099804/object-pool-under-memory-constraints). Senza ricompilare Python con un'implementazione diversa del malloc di C, non credo che sia possibile fare qualcosa di meglio. – max

0

Un'altra opzione consiste nell'utilizzare una cache che mantiene un certo numero di oggetti (ad esempio 100) anziché calcolare esplicitamente il consumo di memoria. Quando si accede a un oggetto, esso viene posto nella parte superiore della cache, se esistente, oppure l'oggetto nella parte inferiore della cache viene sostituito con il nuovo oggetto.

Non testato, ma dovrebbe funzionare in teoria.

Problemi correlati