Jea*_*ant 32 python memory object del
我创建了许多对象然后我存储在列表中.但是我想在一段时间之后删除它们,因为我创建了一个新闻并且不希望我的记忆力变高(在我的情况下,如果我不删除它,它会跳到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)
Run Code Online (Sandbox Code Playgroud)
A和B是我的对象.C是这两个对象的列表.我试图在C中使用for循环删除它:一次使用DEL和其他时间使用函数.它似乎不起作用,因为打印继续显示对象.
我需要这个,因为我多次创建了10万个对象.我第一次创建100k对象,第二次创建100k对象但是我不需要保留之前的100k.如果我不删除它们,内存使用率非常高,非常快.
mgi*_*son 47
TL;博士;
mylist.clear() # Added in python3.(? maybe 5?)
del mylist[:]
Run Code Online (Sandbox Code Playgroud)
可能是最好的方法.这个答案的其余部分试图解释为什么你的其他一些努力不起作用.
cpython至少用于引用计数以确定何时删除对象.这里有多个对同一对象的引用. a引用引用的相同对象c[0].当你遍历c(for i in c:)时,某些点i也会引用同一个对象.所述del关键字删除单个参考,所以:
for i in c:
del i
Run Code Online (Sandbox Code Playgroud)
创建对对象的引用c然后删除该引用 - 但该对象仍然有其他引用(c例如存储在其中),因此它将保持不变.
以同样的方式:
def kill(self):
del self
Run Code Online (Sandbox Code Playgroud)
仅删除该方法中对象的引用.从列表中删除所有引用的一种方法是使用切片分配:
mylist = list(range(10000))
mylist[:] = []
print(mylist)
Run Code Online (Sandbox Code Playgroud)
显然,您也可以删除切片以删除对象:
del mylist[:] #This will implicitly call the `__delslice__` or `__delitem__` method.
Run Code Online (Sandbox Code Playgroud)
这将删除所有引用,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, ...]
Run Code Online (Sandbox Code Playgroud)
最后,更新的python修订版增加了一个clear方法,它做了同样的事情del mylist[:].
mylist = [1, 2, 3]
mylist.clear()
print(mylist)
Run Code Online (Sandbox Code Playgroud)
Jon*_*ric 29
以下是从列表中删除每个项目的方法.
del c[:]
Run Code Online (Sandbox Code Playgroud)
以下是从列表中删除前两项的方法.
del c[:2]
Run Code Online (Sandbox Code Playgroud)
以下是如何从列表中删除单个项目(a在您的情况下),假设c是一个列表.
del c[0]
Run Code Online (Sandbox Code Playgroud)