Python中的可用内存

Python中的可用内存,python,memory,memory-management,out-of-memory,dealloc,Python,Memory,Memory Management,Out Of Memory,Dealloc,如何在python中释放列表的部分内存? 我可以按以下方式做吗 del list[0:j] 或对于单个列表节点: del list[j] 马克:我的脚本分析巨大的列表并创建巨大的输出,这就是为什么我需要立即释放内存 您可以通过四种常用方法删除列表中的项目,包括collections.deque: 列表删除方法: 移除移除第一个匹配值,而不是特定索引 请记住,此方法不返回任何值,而是从列表中删除给定对象 list_1 = [987, 'abc', 'total', 'cpython',

如何在python中释放列表的部分内存? 我可以按以下方式做吗

del list[0:j]  
或对于单个列表节点:

del list[j] 

马克:我的脚本分析巨大的列表并创建巨大的输出,这就是为什么我需要立即释放内存

您可以通过四种常用方法删除列表中的项目,包括collections.deque:

列表删除方法:

移除移除第一个匹配值,而不是特定索引

请记住,此方法不返回任何值,而是从列表中删除给定对象

list_1 = [987, 'abc', 'total', 'cpython', 'abc'];
list_1.pop()
print(list_1)
list_1.pop()
print(list_1)
list_1.pop()
print(list_1)
例如:

list_1 = [987, 'abc', 'total', 'cpython', 'abc'];
list_1.remove('abc')
print(list_1)
list_1.remove('total')
print(list_1)
输出:

[987, 'total', 'cpython', 'abc']
[987, 'cpython', 'abc']
[987, 'total', 'cpython', 'abc']
[987, 'total', 'cpython']
[987, 'abc', 'total', 'cpython']
[987, 'abc', 'total']
[987, 'abc']
deque(['1', '2', '3'])
deque(['2', '3'])
deque(['2', '3', '1'])
deque(['2', '3'])
第二种方法是列表del方法

您必须在此处指定索引号

list_1 = [987, 'abc', 'total', 'cpython', 'abc'];
del list_1[1]
print(list_1)
del list_1[-1:]
print(list_1)
输出:

[987, 'total', 'cpython', 'abc']
[987, 'cpython', 'abc']
[987, 'total', 'cpython', 'abc']
[987, 'total', 'cpython']
[987, 'abc', 'total', 'cpython']
[987, 'abc', 'total']
[987, 'abc']
deque(['1', '2', '3'])
deque(['2', '3'])
deque(['2', '3', '1'])
deque(['2', '3'])
第三种是列表pop方法:

pop删除并返回列表中的最后一项

list_1 = [987, 'abc', 'total', 'cpython', 'abc'];
list_1.pop()
print(list_1)
list_1.pop()
print(list_1)
list_1.pop()
print(list_1)
输出:

[987, 'total', 'cpython', 'abc']
[987, 'cpython', 'abc']
[987, 'total', 'cpython', 'abc']
[987, 'total', 'cpython']
[987, 'abc', 'total', 'cpython']
[987, 'abc', 'total']
[987, 'abc']
deque(['1', '2', '3'])
deque(['2', '3'])
deque(['2', '3', '1'])
deque(['2', '3'])
第四种方法是collections.deque

还有一些外部模块方法,如:

可以从三角形的两侧弹出值:

输出:

[987, 'total', 'cpython', 'abc']
[987, 'cpython', 'abc']
[987, 'total', 'cpython', 'abc']
[987, 'total', 'cpython']
[987, 'abc', 'total', 'cpython']
[987, 'abc', 'total']
[987, 'abc']
deque(['1', '2', '3'])
deque(['2', '3'])
deque(['2', '3', '1'])
deque(['2', '3'])

在Python中,您无法真正手动释放内存

使用del可以减少对象的引用计数。一旦引用计数达到零,当垃圾收集器运行时,对象将被释放

因此,您最好在删除一组对象后手动运行gc.collect

在这些情况下,最好的建议通常是尝试并更改算法。例如,使用生成器而不是Thijs在注释中建议的列表


另一种策略是用硬件解决问题,购买更多的RAM。但这通常有财务和技术限制:-

第一个将从列表中删除第一个j项。第二个将删除第j+1项。确切地说,您是否正在尝试完成?也许您最好使用生成器来创建一个管道,以便在运行中执行您想要的过滤功能?@ThijsvanDien能否提供有关您提到的方法的更多信息?也许我必须为此打开另一个线程?为此,您需要更具体地演示您正在执行的操作生成列表以及如何处理它们。例如,一个重要的因素是,元素是否可以单独考虑,或者决定是否与它们之前或之后的元素相关。是否所有指定的方法都可以释放内存?我在问,因为我的脚本分析了大量列表并创建了大量输出,所以我必须确保在运行时取消分配。@David deque会的,因为它本质上是一个链表。常规列表在内存中是连续的,仅当其元素数为粗略估计数的一半或两倍时才会重新分配。在此之前,内存使用保持不变。更糟糕的是,重新分配操作本身需要与新列表一样多的内存,因为旧列表在被复制之前无法清理。请注意,链表也不理想。例如,每个元素需要更多内存,而索引操作的成本相对较高。