Disons que dans le python Shell (IDLE), j'ai défini certaines classes, fonctions, variables. J'ai également créé des objets des classes. Ensuite, j'ai supprimé certains objets et en ai créé d'autres. Plus tard À un moment donné, comment savoir quels sont les définitions d’objets, de variables et de méthodes actuellement actifs dans la mémoire?
Oui.
>>> import gc
>>> gc.get_objects()
Vous ne trouverez pas cela utile. Il y en a beaucoup d'entre eux. :-) Plus de 4000 au moment où vous démarrez Python.
Toutes les variables actives localement sont peut-être un peu plus utiles:
>>> locals()
Et celui qui est actif dans le monde:
>>> globals()
(Notez que "globalement" dans Python n'est pas vraiment global en tant que tel. Pour cela, vous avez besoin de la gc.get_objects()
ci-dessus, et que vous ne seront probablement jamais utiles, comme mentionné).
La fonction gc.get_objects()
ne trouvera pas tous les objets, par ex. 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é ici
# 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 la plupart 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!
Essayez globals()