如何释放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占用的内存的主要内容,如果未能解决你的问题,请参考以下文章

python中如何释放字典的内存占用?

如何释放Python占用的内存

buff/cache占用太多内存,如何释放内存?

如何释放队列(STL)占用的内存?

创建 matplotlib 图形后如何释放内存

sql 2008 R2 怎样 释放内存