web-dev-qa-db-ja.com

作成した変数、関数などをインタプリタのメモリから削除する方法はありますか?

私はこの質問に対する正確な答えを数日間探し続けてきましたが、まだ何も得られていません。私はプログラミングの初心者ではありませんが、まだ中級レベルではありません。

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()

しかし、これはすべて私が達成しようとしていることとは関係ありません、それはすべての使用済みオブジェクトを一掃するわけではありません。

83
funghorn

delで個々の名前を削除することができます。

del x

あるいはglobals()オブジェクトからそれらを削除することもできます。

for name in dir():
    if not name.startswith('_'):
        del globals()[name]

これは単なるループ例です。それは防御的にアンダースコアで始まらない名前だけを削除し、あなたがあなたのインタプリタの始めにアンダースコアのない名前だけを使ったという(不当ではない)仮定をします。本当に徹底的にやりたいのであれば、代わりに(ホワイトリストに)保存するために名前のハードコードされたリストを使うことができます。インタープリタを終了して再起動する以外に、クリアするための組み込み関数はありません。

インポートしたモジュール(import os)は、sys.modulesで参照されているためインポートされたままになります。それ以降のインポートでは、すでにインポートされているモジュールオブジェクトが再利用されます。あなたの現在のグローバル名前空間にはそれらへの参照がありません。

106
Martijn Pieters

はい。 iPythonですべてを削除する簡単な方法があります。 iPythonコンソールでは、単に次のように入力します。

%reset

システムは確認を求めます。 yを押します。このプロンプトを見たくない場合は、単純に次のように入力してください。

%reset -f

これでうまくいくはずです。

44
EyesBear

Pythonのガベージコレクタを使うことができます。

import gc
gc.collect()
7
Fardin

もしあなたがJupytername__やipythonname__のような対話的な環境にいるなら、あなたは興味があるかもしれません---それらが重くなっているなら不要なvarのクリア

resetname__やipythonname__のようなインタラクティブなPythonセッションでは、マジックコマンドJupytername__とreset_selectiveが利用可能です。

1)resetname __

resetname__引数なしで呼び出された場合、ユーザーが定義したすべての名前を削除して名前空間をリセットします。

inname__およびoutname__パラメーターは、入出力キャッシュをフラッシュするかどうかを指定します。ディレクトリ履歴はdhistname__パラメータでフラッシュされます。

reset in out

もう1つ興味深いのは、numpy配列だけを削除するarrayname__です。

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

6
user1767754

これは私のために働きました。

あなたはグローバルに続いてローカルに2回それを実行する必要があります

for name in dir():
    if not name.startswith('_'):
        del globals()[name]

for name in dir():
    if not name.startswith('_'):
        del locals()[name]
3
Viswa

実際には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を使用しても、実際には効果がありません。これらの名前はスコープを超えて削除されたためです。

3
d-coder