[Numpy-discussion] Tracking and inspecting numpy objects

Sebastian Berg 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
>         using
>         > gc.get_objects(), but, with respect to numpy objects, the
>         returned
>         > 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,
>         numpy.ndarray)]
>         >
>         > 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
>         (except
>         possibly its `arr.base`).
>         
>         Second of all -- and this is an issue -- numpy doesn't
>         actually
>         implement the traverse slot, so it won't even work for object
>         arrays
>         (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 [15]: class T(tuple):
   ....:     pass
   ....: 

In [16]: t = T()

In [17]: objs = [o for o in gc.get_objects() if isinstance(o, T)]

In [18]: objs
Out[18]: [()]

In [19]: a = 123.

In [20]: objs = [o for o in gc.get_objects() if isinstance(o, float)]

In [21]: objs
Out[21]: []

So I guess nothing is tracked, unless it contains things, and numpy
arrays don't say they can contain things (i.e. no traverse).

- Sebastian



> _______________________________________________
> NumPy-Discussion mailing list
> NumPy-Discussion at scipy.org
> http://mail.scipy.org/mailman/listinfo/numpy-discussion

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 819 bytes
Desc: This is a digitally signed message part
URL: <http://mail.python.org/pipermail/numpy-discussion/attachments/20140915/e206f9da/attachment.sig>


More information about the NumPy-Discussion mailing list