python内存管理分析


Posted in Python onApril 08, 2015

本文较为详细的分析了python内存管理机制。分享给大家供大家参考。具体分析如下:

内存管理,对于Python这样的动态语言,是至关重要的一部分,它在很大程度上甚至决定了Python的执行效率,因为在Python的运行中,会创建和销毁大量的对象,这些都涉及到内存的管理。

小块空间的内存池

在Python中,许多时候申请的内存都是小块的内存,这些小块内存在申请后,很快又会被释放,由于这些内存的申请并不是为了创建对象,所以并没有对象一级的内存池机制。

python内存管理分析

Python内存池全景

这就意味着Python在运行期间会大量地执行malloc和free的操作,频繁地在用户态和核心态之间进行切换,这将严重影响Python的执行效率。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。这也就是之前提到的Pymalloc机制。

在Python 2.5中,Python内部默认的小块内存与大块内存的分界点定在256个字节,这个分界点由前面我们看到的名为SMALL_REQUEST_THRESHOLD的符号控制。

也就是说,当申请的内存小于256字节时,PyObject_Malloc会在内存池中申请内存;当申请的内存大于256字节时,PyObject_Malloc的行为将蜕化为malloc的行为。当然,通过修改Python源代码,我们可以改变这个默认值,从而改变Python的默认内存管理行为。

在一个对象的引用计数减为0时,与该对象对应的析构函数就会被调用。

但是要特别注意的是,调用析构函数并不意味着最终一定会调用free释放内存空间,如果真是这样的话,那频繁地申请、释放内存空间会使 Python的执行效率大打折扣(更何况Python已经多年背负了人们对其执行效率的不满)。一般来说,Python中大量采用了内存对象池的技术,使用这种技术可以避免频繁地申请和释放内存空间。因此在析构时,通常都是将对象占用的空间归还到内存池中。

"这个问题就是:Python的arena从来不释放pool。这个问题为什么会引起类似于内存泄漏的现象呢。考虑这样一种情形,申请10*1024*1024个16字节的小内存,这就意味着必须使用160M的内存,由于Python没有默认将前面提到的限制内存池的WITH_MEMORY_LIMITS编译符号打开,所以Python会完全使用arena来满足你的需求,这都没有问题,关键的问题在于过了一段时间,你将所有这些16字节的内存都释放了,这些内存都回到arena的控制中,似乎没有问题。

但是问题恰恰就在这时出现了。因为arena始终不会释放它维护的pool集合,所以这160M的内存始终被Python占用,如果以后程序运行中再也不需要160M如此巨大的内存,这点内存岂不是就浪费了?"

Python内存管理规则:del的时候,把list的元素释放掉,把管理元素的大对象回收到py对象缓冲池里。

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python复制文件代码实现
Dec 23 Python
sublime text 3配置使用python操作方法
Jun 11 Python
Python 运行 shell 获取输出结果的实例
Jan 07 Python
Django框架搭建的简易图书信息网站案例
May 25 Python
python实现KNN分类算法
Oct 16 Python
np.dot()函数的用法详解
Jan 17 Python
python 串行执行和并行执行实例
Apr 30 Python
python保留格式汇总各部门excel内容的实现思路
Jun 01 Python
为什么是 Python -m
Jun 19 Python
python使用requests库爬取拉勾网招聘信息的实现
Nov 20 Python
pandas数据分组groupby()和统计函数agg()的使用
Mar 04 Python
对Keras自带Loss Function的深入研究
May 25 Python
Python中关于字符串对象的一些基础知识
Apr 08 #Python
Python MySQLdb模块连接操作mysql数据库实例
Apr 08 #Python
python单例模式实例分析
Apr 08 #Python
在Docker上部署Python的Flask框架的教程
Apr 08 #Python
python threading模块操作多线程介绍
Apr 08 #Python
Python使用scrapy采集数据时为每个请求随机分配user-agent的方法
Apr 08 #Python
python中Genarator函数用法分析
Apr 08 #Python
You might like
PHP7正式版测试,性能惊艳!
2015/12/08 PHP
PHP写的简单数字验证码实例
2017/05/23 PHP
学习从实践开始之jQuery插件开发 菜单插件开发
2012/05/03 Javascript
使用JavaScript实现Java的List功能(实例讲解)
2013/11/07 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
表单验证插件Validation应用的实例讲解
2015/10/10 Javascript
JavaScript实现ASC转汉字及汉字转ASC的方法
2016/01/23 Javascript
js事件驱动机制 浏览器兼容处理方法
2016/07/23 Javascript
jQuery树形插件jquery.simpleTree.js用法分析
2016/09/05 Javascript
Jquery Easyui日历组件Calender使用详解(23)
2016/12/18 Javascript
jQuery自定义图片上传插件实例代码
2017/04/04 jQuery
js评分组件使用详解
2017/06/06 Javascript
浅谈PDF.js使用心得
2018/06/07 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
详解Angular5/Angular6项目如何添加热更新(HMR)功能
2018/10/10 Javascript
基于Vue+elementUI实现动态表单的校验功能(根据条件动态切换校验格式)
2019/04/04 Javascript
js实现数字从零慢慢增加到指定数字示例
2019/11/07 Javascript
利用Python的Django框架生成PDF文件的教程
2015/07/22 Python
Python操作Word批量生成文章的方法
2015/07/28 Python
Python入门之三角函数tan()函数实例详解
2017/11/08 Python
Django如何使用第三方服务发送电子邮件
2019/08/14 Python
python常见字符串处理函数与用法汇总
2019/10/30 Python
Python操作多维数组输出和矩阵运算示例
2019/11/28 Python
Django多层嵌套ManyToMany字段ORM操作详解
2020/05/19 Python
详解python logging日志传输
2020/07/01 Python
通过实例简单了解python yield使用方法
2020/08/06 Python
CSS3点击按钮实现背景渐变动画效果
2016/10/19 HTML / CSS
英国IT硬件供应商,定制游戏PC:Mesh Computers
2019/03/28 全球购物
以下为Windows NT 下的32 位C++程序,请计算sizeof 的值
2016/12/07 面试题
中医药大学市场营销专业自荐信
2013/09/29 职场文书
销售会计工作职责
2013/12/02 职场文书
网球场地租赁协议范本
2014/10/07 职场文书
好好学习保证书
2015/02/26 职场文书
SQL Server2019数据库之简单子查询的具有方法
2021/04/27 SQL Server
idea编译器vue缩进报错问题场景分析
2021/07/04 Vue.js
Java8利用Stream对列表进行去除重复的方法详解
2022/04/14 Java/Android