[Numpy-discussion] Tracking and inspecting numpy objects
sebastian at sipsolutions.net
Mon Sep 15 06:11:55 EDT 2014
On Mo, 2014-09-15 at 12:05 +0200, Eelco Hoogendoorn wrote:
> On Mon, Sep 15, 2014 at 11:55 AM, Sebastian Berg
> <sebastian at sipsolutions.net> wrote:
> On Mo, 2014-09-15 at 10:16 +0200, Mads Ipsen wrote:
> > Hi,
> > I am trying to inspect the reference count of numpy arrays
> generated by
> > my application.
> > Initially, I thought I could inspect the tracked objects
> > gc.get_objects(), but, with respect to numpy objects, the
> > container is empty. For example:
> > import numpy
> > import gc
> > data = numpy.ones(1024).reshape((32,32))
> > objs = [o for o in gc.get_objects() if isinstance(o,
> > print objs # Prints empty list
> > print gc.is_tracked(data) # Print False
> > Why is this? Also, is there some other technique I can use
> to inspect
> > all numpy generated objects?
> Two reasons. First of all, unless your array is an object
> arrays (or a
> structured one with objects in it), there are no objects to
> track. The
> array is a single python object without any referenced objects
> possibly its `arr.base`).
> Second of all -- and this is an issue -- numpy doesn't
> implement the traverse slot, so it won't even work for object
> (numpy object arrays do not support circular garbage
> collection at this
> time, please feel free to implement it ;)).
> - Sebastian
> Does this answer why the ndarray object itself isn't tracked though? I
> must say I find this puzzling; the only thing I can think of is that
> the python compiler notices that data isn't used anymore after its
> creation, and deletes it right after its creation as an optimization,
> but that conflicts with my own experience of the GC.
Not sure if it does, but my quick try and error says:
In : class T(tuple):
In : t = T()
In : objs = [o for o in gc.get_objects() if isinstance(o, T)]
In : objs
In : a = 123.
In : objs = [o for o in gc.get_objects() if isinstance(o, float)]
In : objs
So I guess nothing is tracked, unless it contains things, and numpy
arrays don't say they can contain things (i.e. no traverse).
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
-------------- next part --------------
A non-text attachment was scrubbed...
Size: 819 bytes
Desc: This is a digitally signed message part
More information about the NumPy-Discussion