2016-09-02 14 views
0
%reset 
%reset -f 

Pythonの:汚染

%reset_selective a 
%reset_selective -f a 

ずにループの1以外のすべての変数を削除する「-f」は求めず、」力を意味する、「すべてクリア」Matlabのコマンドに便利Pythonの代替です確認」と 『_selectiveは、』選択のように明確にhttps://ipython.org/ipython-doc/3/interactive/magics.htmlここに示したワークスペース内の変数を削除する

who_ls 

と組み合わせて使用​​することができます。今

私は、標準の変数を除くすべての変数を削除する例

for j in range(1000): 
    a = crazy_function1() 
    b = crazy_function2() 
    ... 
    m = crazy_function18() 
    n = crazy_function19() 
    ... 
    z = crazy_functionN() 

のために、各サイクルの終わりに、私は多くの変数を定義しようと思っているループを管理していますPythonのワークスペースと、私が導入した変数のいくつか(この例ではmとnのみ)。これにより、汚染やメモリの負担を避けることができるため、コードをより効率的かつ安全にすることができます。

私は「who_lsは」結果はリストのように見えることを見た、それゆえ私はMまたはN

for j in range(1000): 
    a = crazy_function1() 
    b = crazy_function2() 
    ... 
    m = crazy_function18() 
    n = crazy_function19() 
    ... 
    z = crazy_functionN() 
    if who_ls[j] != m or who_ls[j] != n: 
     %reset_selective -f who_ls[j] 

に等しくないすべての変数を削除するループで思ったが、それはwho_lsのルックスと機能しません。リストとしては動作しませんが、リストとしては機能しません。どのようにコードの最後の行を変更しますか? 何かありますか?

%reset_selective -f, except variables(m, n) 

ですか?

+2

不要なものを、たとえば辞書やリストに保存してみませんか?その後、すべてを一度に削除することができます。そして、それらの変数を削除するとより効率的になると確信していますか? MATLABはそのメモリをOSに戻さず、同じシナリオでipythonのガベージコレクションがどのように動作するのか分かりません。 –

+0

辞書に不要な変数をすべて格納するのは良い考えです。システムが複雑になればなるほど、コントロールが少なくて済むようになります。一日の終わりには、何をしているのかを100%コントロールすることはできません。このような理由から、私は不要な変数を削除することが重要だと考えています。 –

+0

[作成された変数や関数などをインタプリタのメモリから削除する方法はありますか?](http://stackoverflow.com/questions/26545051/is-there-a-way-to-delete- created-variables-functions-from-th-of-th-of-th-メモリ) –

答えて

2

変数の範囲を制限する通常の方法は、関数で変数を使用することです。機能が終了すると、そのlocalsが消えます。

In [71]: def foo(): 
    ...:  a=1 
    ...:  b=2 
    ...:  c=[1,2,3] 
    ...:  d=np.arange(12) 
    ...:  print(locals()) 
    ...:  del(a,b,c) 
    ...:  print(locals()) 
    ...:  
In [72]: foo() 
{'d': array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]), 'c': [1, 2, 3], 'a': 1, 'b': 2} 
{'d': array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11])} 

==================

%who_lsリストを返し、

xx = %who_ls 
のように、RHSで使用することができ

とし、そのリストを反復することができます。しかし、これは変数そのものではなく、変数名のリストであることに注意してください。

for x in xx: 
    if len(x)==1: 
     print(x) 
     # del(x) does not work 

長さ1

======================

%reset_selectiveを使用する簡単な方法のすべての名前を示します正規表現が簡単に見つけることができるプレフィックスのように、一時変数に特有の名前を付けることです。例えば

In [198]: temp_a, temp_b, temp_c, x, y = 1,'one string',np.arange(10), 10, [1,23] 
In [199]: who_ls 
Out[199]: ['np', 'temp_a', 'temp_b', 'temp_c', 'x', 'y'] 
In [200]: %reset_selective -f temp 
In [201]: who_ls 
Out[201]: ['np', 'x', 'y'] 

====================

は、ここで名前のリストから、この削除を行う例です。削除しようとしている実際の変数とその名前には違いがあることに注意してください。

いくつかの変数を作成し、

In [221]: temp_a, temp_b, temp_c, x, y = 1,'one string',np.arange(10), 10, [1,23] 
In [222]: dellist=['temp_a', 'temp_c','x'] 

を削除する名前のリストは、シェルを取得し、user_nswho_lsself.shell.user_nsのキーを使用します。

In [223]: ip=get_ipython() 
In [224]: user_ns=ip.user_ns 

In [225]: %who_ls 
Out[225]: ['dellist', 'i', 'ip', 'np', 'temp_a', 'temp_b', 'temp_c', 'user_ns', 'x', 'y'] 

In [226]: for i in dellist: 
    ...:  del(user_ns[i]) 
    ...:  
In [227]: %who_ls 
Out[227]: ['dellist', 'i', 'ip', 'np', 'temp_b', 'user_ns', 'y'] 

だから我々はそれらを削除するために、user_ns辞書で名前を検索する必要があります。この削除コードは、いくつかの変数、dellist,i,ip,user_nsを作成することに注意してください。あなたが心配しているどのように多くの変数

==============

?彼らはどれくらいの大きさですか?スカラー、リスト、numpy配列文字で名前を付けることができる十数個のスカラーは、あまり記憶を取りません。また、変数の生成にパターンがある場合は、それぞれに固有の名前を付けるのではなく、リストまたは辞書でそれらを収集する方が意味があります。

一般に、del()または%resetを使用するのではなく、変数の範囲を制限するために関数を使用する方がよいです。大量の配列を扱う場合、メモリを大量に消費し、メモリエラーが発生することがある場合は、delまたはa=Noneを使用してそれらを削除することがあります。しかし、通常の変数は特別な注意を必要としません(数日間、セッションが中断しているipythonのセッションでさえも)。

関連する問題