如何释放Python占用的内存
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何释放Python占用的内存相关的知识,希望对你有一定的参考价值。
象的引用计数减少;函数运行结束,所有局部变量都被销毁,对象的引用计数也就随之减少。例如 foo(x) 运行结束,x 被销毁;
当变量被赋值给另一个对象时,原对象的引用计数也会减少。例如 x = 4,这时候 3 这个对象的引用计数就减 1 了;
使用 del 删除一个变量也会导致对象引用减少。例如 del x;
对象从集合对象中移除。例如 lst.remove(x);
包含对象的集合对象被销毁。例如 del lst;
这些操作都可能使对象变成垃圾回收对象,由垃圾收集器负责收集,当然垃圾收集器也负责处理循环引用对象。
要立即释放,可以使用下面的代码
import gc
gc.collect() 参考技术A 我觉得可能是因为你的py文件在第一次启动后,已经编译成pyc文件了,再次启动的时候都是加载pyc,省去了编译的阶段,所以速度很快。
你可以试着把程序目录下的所有pyc或者你的代码文件对应的pyc文件删除,看看是不是可以和第一次加载速度相同 参考技术B 我觉得可能是因为你的py文件在第一次启动后,已经编译成pyc文件了,再次启动的时候都是加载pyc,省去了编译的阶段,所以速度很快。
如何释放队列(STL)占用的内存?
【中文标题】如何释放队列(STL)占用的内存?【英文标题】:How to free the memory occupied by a queue(STL)? 【发布时间】:2019-06-20 15:09:31 【问题描述】:我正在研究一个涉及大量队列的问题,并且很好奇为了释放未使用队列的内存,是清空队列(弹出)足够还是我必须做其他事情?
尝试使用 'free' ,但出现错误。
【问题讨论】:
【参考方案1】:std::queue 只是其他 STL 容器类型的包装器,默认情况下是 std::deque,但也可能是 std::list 或 std::vector。当您的队列超出范围时,会自动触发底层容器的析构函数。
如果您想手动释放队列消耗的内存,并且队列的数据类型是原始数据类型(int、float、...)或具有适当的析构函数(如果不是全部,也是大多数 STL 数据类型) ,您可以在 C++11 及更高版本中执行:
std::queue<your_type>().swap(your_queue);
或者对于旧版本:
std::queue<your_type> temp;
std::swap(temp, your_queue);
它创建一个空队列,将其内容与您的队列交换,然后销毁它(因为它在交换后立即超出范围),只留下您手中的空队列。
如果您使用的自定义类型的队列没有适当的析构函数,我认为唯一的方法是逐个弹出元素并手动释放弹出元素的内存。
【讨论】:
【参考方案2】:Be careful with pointers.
弹出应该足够了,因为 STL 类管理自己的资源,例如
queue <int> g;
g.push(10);
g.push(20);
g.push(30);
while (!g.empty())
g.pop();
Reference from GeeksforGeeks
【讨论】:
以上是关于如何释放Python占用的内存的主要内容,如果未能解决你的问题,请参考以下文章