web-dev-qa-db-ja.com

すべての初期化されたオブジェクトと関数定義のリストをPythonで有効にするにはどうすればよいですか?

python Shell(IDLE))で、いくつかのクラス、関数、変数を定義したとします。また、クラスのオブジェクトを作成しました。次に、いくつかのオブジェクトを削除し、他のオブジェクトをいくつか作成しました。後である時点で、現在アクティブなオブジェクト、変数、およびメソッド定義がメモリ内でアクティブであることをどのようにして知ることができますか?

43
user235273

はい。

_>>> import gc
>>> gc.get_objects()
_

それが便利だとは限らない。それらのロットがあります。 :-) Pythonを起動した直後の4000以上。

おそらくもう少し便利なのは、ローカルでアクティブなすべての変数です。

_>>> locals()
_

そしてグローバルに活動しているもの:

_>>> globals()
_

(Pythonの "globally"は実際にはglobalではないことに注意してください。そのためには、上記のgc.get_objects()が必要であり、言及されているように、これまでに有用であるとは考えにくいです。

53
Lennart Regebro

関数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!
6
skjerns

お試しください globals()

5
NPE