Thanks to everybody for taking time to answer! Best regards,
Mads On 15/09/14 12:11, Sebastian Berg wrote: > On Mo, 2014-09-15 at 12:05 +0200, Eelco Hoogendoorn wrote: >> >> >> >> On Mon, Sep 15, 2014 at 11:55 AM, Sebastian Berg >> <sebast...@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@scipy.org >> http://mail.scipy.org/mailman/listinfo/numpy-discussion > > > > _______________________________________________ > NumPy-Discussion mailing list > NumPy-Discussion@scipy.org > http://mail.scipy.org/mailman/listinfo/numpy-discussion > -- +---------------------------------------------------------+ | Mads Ipsen | +----------------------+----------------------------------+ | Gåsebæksvej 7, 4. tv | phone: +45-29716388 | | DK-2500 Valby | email: mads.ip...@gmail.com | | Denmark | map : www.tinyurl.com/ns52fpa | +----------------------+----------------------------------+ _______________________________________________ NumPy-Discussion mailing list NumPy-Discussion@scipy.org http://mail.scipy.org/mailman/listinfo/numpy-discussion