Caching objects in a C extension
Diez B. Roggisch
deets at nospam.web.de
Fri Jan 8 05:59:32 EST 2010
casevh schrieb:
> I'm working with a C extension that needs to rapidly create and delete
> objects. I came up with an approach to cache objects that are being
> deleted and resurrect them instead of creating new objects. It appears
> to work well but I'm afraid I may be missing something (besides
> heeding the warning in the documentation that _Py_NewReference is for
> internal interpreter use only).
>
> Below is a simplified version of the approach I'm using:
>
> MyType_dealloc(MyTypeObject *self)
> {
> if(I_want_to_save_MyType(self)) {
> // Save the object pointer in a cache
> save_it(self);
> } else {
> PyObject_Del(self);
> }
> }
>
> MyType_new(void)
> {
> MyTypeObject *self;
> if(there_is_an_object_in_the_cache) {
> self = get_object_from_cache;
> _Py_NewReference((PyObject*)self);
> } else {
> if(!(self = PyObjectNew(MyTypeObject, &MyType))
> return NULL;
> initialize_the_new_object(self);
> }
> return self;
> }
>
> The objects referenced in the cache have a reference count of 0 and I
> don't increment the reference count until I need to resurrect the
> object. Could these objects be clobbered by the garbage collector?
> Would it be safer to create the new reference before stuffing the
> object into the cache (even though it will look like there is a memory
> leak when running under a debug build)?
Deep out of my guts I'd say keeping a reference, and using you own
LRU-scheme would be the safest without residing to use dark magic.
Diez
More information about the Python-list
mailing list