Disons que dans le shell python (IDLE), j'ai défini des classes, des fonctions et des variables. J'ai également créé des objets de ces classes. Puis j'ai supprimé certains objets et en ai créé d'autres. À un moment ultérieur, comment puis-je savoir quels sont les objets, variables et définitions de méthodes actuellement actifs dans la mémoire ?
Réponses
Trop de publicités?Sí.
>>> import gc
>>> gc.get_objects()
Non pas que vous trouverez ça utile. Il y a un lot d'entre eux. :-) Plus de 4000 juste quand vous commencez Python.
Toutes les variables actives localement sont peut-être un peu plus utiles :
>>> locals()
Et celui qui est actif au niveau mondial :
>>> globals()
(Notez que "globalement" en Python n'est pas vraiment mondial en tant que tel. Pour cela, vous avez besoin du gc.get_objects()
ci-dessus, et qu'il est peu probable que vous trouviez jamais utile, comme mentionné).
La fonction gc.get_objects()
ne trouvera pas tous les objets, par exemple les tableaux numpy ne seront pas trouvés.
import numpy as np
import gc
a = np.random.rand(100)
objects = gc.get_objects()
print(any[x is a for x in objects])
# will not find the numpy array
Vous aurez besoin d'une fonction qui développe tous les objets, comme expliqué aquí
# code from https://utcc.utoronto.ca/~cks/space/blog/python/GetAllObjects
import gc
# Recursively expand slist's objects
# into olist, using seen to track
# already processed objects.
def _getr(slist, olist, seen):
for e in slist:
if id(e) in seen:
continue
seen[id(e)] = None
olist.append(e)
tl = gc.get_referents(e)
if tl:
_getr(tl, olist, seen)
# The public function.
def get_all_objects():
"""Return a list of all live Python
objects, not including the list itself."""
gcl = gc.get_objects()
olist = []
seen = {}
# Just in case:
seen[id(gcl)] = None
seen[id(olist)] = None
seen[id(seen)] = None
# _getr does the real work.
_getr(gcl, olist, seen)
return olist
Maintenant, nous devrions être en mesure de trouver le plus objets
import numpy as np
import gc
a = np.random.rand(100)
objects = get_all_objects()
print(any[x is a for x in objects])
# will return True, the np.ndarray is found!