42

多くのオブジェクトを作成してから、リストに保存します。しかし、ニュースを作成し、メモリが高くなりたくないので、しばらくしてから削除したいと思います(私の場合、削除しないと20ギガのRAMにジャンプします)。

これが私がやろうとしていることを説明するための小さなコードです:

class test:
    def __init__(self):
        self.a = "Hello World"
    def kill(self):
        del self

a = test()
b = test()
c = [a,b]

print("1)Before:",a,b)

for i in c:
    del i

for i in c:
    i.kill()   

print("2)After:",a,b)

AとBは私のオブジェクトです。Cは、これら2つのオブジェクトのリストです。私はCのforループでそれを確実に削除しようとしています:1回はDELで、もう1回は関数で。印刷物にオブジェクトが表示され続けるため、機能していないようです。

10万個のオブジェクトを何度も作成するので、これが必要です。最初に100kオブジェクトを作成し、2回目は別の100kを作成しますが、前の100kを保持する必要はありません。それらを削除しないと、メモリ使用量が非常に速くなります。

4

4 に答える 4

65

tl; dr;

mylist.clear()  # Added in Python 3.3
del mylist[:]

これを行うにはおそらく最良の方法です。この回答の残りの部分では、他のいくつかの取り組みがうまくいかなかった理由を説明しようとしています。


cpythonは、少なくとも参照カウントで機能して、オブジェクトがいつ削除されるかを決定します。ここでは、同じオブジェクトへの複数の参照があります。 a参照するのと同じオブジェクトをc[0]参照します。c( )をループするfor i in c:と、ある時点iで同じオブジェクトも参照します。delキーワードは単一の参照を削除するため、次のようになります。

for i in c:
   del i

内のオブジェクトへの参照を作成してから、cその参照を削除しますが、オブジェクトには他の参照(cたとえば、に格納されているもの)が残っているため、オブジェクトは保持されます。

同じやり方で:

def kill(self):
    del self

そのメソッド内のオブジェクトへの参照のみを削除します。リストからすべての参照を削除する1つの方法は、スライス割り当てを使用することです。

mylist = list(range(10000))
mylist[:] = []
print(mylist)

どうやら、スライスを削除して、所定の場所にあるオブジェクトを削除することもできます。

del mylist[:]  #This will implicitly call the `__delslice__` or `__delitem__` method.

これにより、からすべての参照が削除され、mylistを参照するものからもすべての参照が削除されmylistます。それを単にリストを削除することと比較してください-例えば

mylist = list(range(10000))
b = mylist
del mylist
#here we didn't get all the references to the objects we created ...
print(b) #[0, 1, 2, 3, 4, ...]

最後に、最近のPythonリビジョンclearでは、同じことを行うメソッドが追加されてdel mylist[:]います。

mylist = [1, 2, 3]
mylist.clear()
print(mylist)
于 2013-01-22T18:18:22.080 に答える
31

リストからすべてのアイテムを削除する方法は次のとおりです。

del c[:]

リストから最初の2つのアイテムを削除する方法は次のとおりです。

del c[:2]

aリストを想定して、リストから1つのアイテムを削除する方法は次のとおりです(あなたの場合) c

del c[0]
于 2013-01-22T18:18:35.090 に答える
1

オブジェクトabそれ自体を削除することが目標である場合(これは事実であるように見えます)、リストを作成すること[a, b]は役に立ちません。代わりに、それらのオブジェクトの名前として使用される文字列のリストを保持する必要があります。globals()これらにより、辞書にアクセスすることにより、ループ内のオブジェクトを削除できます。

c = ['a', 'b']
# create and work with a and b    
for i in c:
    del globals()[i]
于 2018-06-20T09:36:26.890 に答える
0

リスト内のすべてのオブジェクトを削除するには、直接書き込むことができますlist = []

次に例を示します。

>>> a = [1, 2, 3]
>>> a
[1, 2, 3]
>>> a = []
>>> a
[]
于 2017-03-23T19:49:56.703 に答える