私はこの質問に対する正確な答えを数日間探し続けてきましたが、まだ何も得られていません。私はプログラミングの初心者ではありませんが、まだ中級レベルではありません。
Pythonのシェルにいるときは、dir()
と入力すると、現在のスコープ(メインブロック)内のすべてのオブジェクトのすべての名前を見ることができます。そのうちの6つがあります。
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__']
それで、例えばx = 10
のように変数を宣言すると、それは組み込みモジュールdir()
の下のオブジェクトのリストに自動的に追加されます。そしてdir()
を再びタイプすると、それは今示されます:
['__builtins__', '__doc__', '__loader__', '__name__', '__package__', '__spec__', 'x']
関数、クラスなどにも同じことが言えます。
最初に利用可能になった標準6を消去せずに、これらすべての新しいオブジェクトを削除する方法を教えてください。
私はここで "メモリのクリーニング"、 "コンソールのクリーニング"について読みました。これはコマンドプロンプトウィンドウからすべてのテキストを消去します。
>>> import sys
>>> clear = lambda: os.system('cls')
>>> clear()
しかし、これはすべて私が達成しようとしていることとは関係ありません、それはすべての使用済みオブジェクトを一掃するわけではありません。
del
で個々の名前を削除することができます。
del x
あるいはglobals()
オブジェクトからそれらを削除することもできます。
for name in dir():
if not name.startswith('_'):
del globals()[name]
これは単なるループ例です。それは防御的にアンダースコアで始まらない名前だけを削除し、あなたがあなたのインタプリタの始めにアンダースコアのない名前だけを使ったという(不当ではない)仮定をします。本当に徹底的にやりたいのであれば、代わりに(ホワイトリストに)保存するために名前のハードコードされたリストを使うことができます。インタープリタを終了して再起動する以外に、クリアするための組み込み関数はありません。
インポートしたモジュール(import os
)は、sys.modules
で参照されているためインポートされたままになります。それ以降のインポートでは、すでにインポートされているモジュールオブジェクトが再利用されます。あなたの現在のグローバル名前空間にはそれらへの参照がありません。
はい。 iPythonですべてを削除する簡単な方法があります。 iPythonコンソールでは、単に次のように入力します。
%reset
システムは確認を求めます。 yを押します。このプロンプトを見たくない場合は、単純に次のように入力してください。
%reset -f
これでうまくいくはずです。
Pythonのガベージコレクタを使うことができます。
import gc
gc.collect()
もしあなたがJupyter
name__やipython
name__のような対話的な環境にいるなら、あなたは興味があるかもしれません---それらが重くなっているなら不要なvarのクリア。
reset
name__やipython
name__のようなインタラクティブなPythonセッションでは、マジックコマンドJupyter
name__とreset_selective
が利用可能です。
1)reset
name __
reset
name__引数なしで呼び出された場合、ユーザーが定義したすべての名前を削除して名前空間をリセットします。
in
name__およびout
name__パラメーターは、入出力キャッシュをフラッシュするかどうかを指定します。ディレクトリ履歴はdhist
name__パラメータでフラッシュされます。
reset in out
もう1つ興味深いのは、numpy配列だけを削除するarray
name__です。
reset array
2)reset_selective
ユーザーが定義した名前を削除してネームスペースをリセットします。入出力履歴は必要に応じて残しておきます。
クリーンアレイの例:
In [1]: import numpy as np
In [2]: littleArray = np.array([1,2,3,4,5])
In [3]: who_ls
Out[3]: ['littleArray', 'np']
In [4]: reset_selective -f littleArray
In [5]: who_ls
Out[5]: ['np']
出典: http://ipython.readthedocs.io/en/stable/interactive/magics.html
これは私のために働きました。
あなたはグローバルに続いてローカルに2回それを実行する必要があります
for name in dir():
if not name.startswith('_'):
del globals()[name]
for name in dir():
if not name.startswith('_'):
del locals()[name]
実際にはpythonはもう使われていないメモリを再利用するでしょう。これはガベージコレクションと呼ばれ、これはpythonの自動処理です。それでもやりたいのであれば、del variable_name
で削除できます。変数をNone
に代入することによっても可能です。
a = 10
print a
del a
print a ## throws an error here because it's been deleted already.
参照されていないPythonオブジェクトからメモリを本当に回収する唯一の方法は、ガベージコレクタを使用することです。 delキーワードは単にオブジェクトから名前をアンバインドするだけですが、それでもオブジェクトはガベージコレクションされる必要があります。 gcモジュールを使用してガベージコレクタを強制的に実行することはできますが、これはほぼ確実に時期尚早の最適化ですが、それ自体にリスクがあります。 del
を使用しても、実際には効果がありません。これらの名前はスコープを超えて削除されたためです。