python Shell(IDLE))で、いくつかのクラス、関数、変数を定義したとします。また、クラスのオブジェクトを作成しました。次に、いくつかのオブジェクトを削除し、他のオブジェクトをいくつか作成しました。後である時点で、現在アクティブなオブジェクト、変数、およびメソッド定義がメモリ内でアクティブであることをどのようにして知ることができますか?
はい。
_>>> import gc
>>> gc.get_objects()
_
それが便利だとは限らない。それらのロットがあります。 :-) Pythonを起動した直後の4000以上。
おそらくもう少し便利なのは、ローカルでアクティブなすべての変数です。
_>>> locals()
_
そしてグローバルに活動しているもの:
_>>> globals()
_
(Pythonの "globally"は実際にはglobalではないことに注意してください。そのためには、上記のgc.get_objects()
が必要であり、言及されているように、これまでに有用であるとは考えにくいです。
関数gc.get_objects()
は、すべてのオブジェクトを見つけるわけではありません。 numpy配列は見つかりません。
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
説明されているように、すべてのオブジェクトを展開する関数が必要になります here
# 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
これで most オブジェクトを見つけることができるはずです
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!
お試しください globals()