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 时间操作例子和时间格式化参数小结
Apr 24 Python
python获取外网ip地址的方法总结
Jul 02 Python
浅析Python中的for 循环
Jun 09 Python
python一键升级所有pip package的方法
Jan 16 Python
基于使用paramiko执行远程linux主机命令(详解)
Oct 16 Python
Python创建二维数组实例(关于list的一个小坑)
Nov 07 Python
浅谈利用numpy对矩阵进行归一化处理的方法
Jul 11 Python
详解Python基础random模块随机数的生成
Mar 23 Python
Django如何防止定时任务并发浅析
May 14 Python
Python中遍历列表的方法总结
Jun 27 Python
python Matplotlib数据可视化(2):详解三大容器对象与常用设置
Sep 30 Python
python b站视频下载的五种版本
May 27 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
php中$美元符号与Zen Coding冲突问题解决方法分享
2014/05/28 PHP
php获得文件夹下所有文件的递归算法的简单实例
2016/11/01 PHP
Symfony2获取web目录绝对路径、相对路径、网址的方法
2016/11/14 PHP
php求数组全排列,元素所有组合的方法总结
2017/03/14 PHP
php获取手机端的号码以及ip地址实例代码
2018/09/12 PHP
thinkphp5 框架结合plupload实现图片批量上传功能示例
2020/04/04 PHP
JavaScript 学习笔记 Black.Caffeine 09.11.28
2009/11/30 Javascript
js 幻灯片的实现
2011/12/06 Javascript
jtable列中自定义button示例代码
2013/11/21 Javascript
js获取判断上传文件后缀名的示例代码
2014/02/19 Javascript
js获得页面的高度和宽度的方法
2014/02/23 Javascript
JSONP跨域的原理解析及其实现介绍
2014/03/22 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
JavaScript数据结构与算法之链表
2016/01/29 Javascript
jquery的ajax提交form表单的两种方法小结(推荐)
2016/05/25 Javascript
微信小程序学习(4)-系统配置app.json详解
2017/01/12 Javascript
ionic2 tabs 图标自定义实例
2017/03/08 Javascript
iView-admin 动态路由问题的解决方法
2018/10/03 Javascript
Nodejs让异步变成同步的方法
2019/03/02 NodeJs
[00:44]华丽开场!DOTA2勇士令状带来全新对阵画面
2019/05/15 DOTA
python zip文件 压缩
2008/12/24 Python
关于python的list相关知识(推荐)
2017/08/30 Python
Python基于百度AI的文字识别的示例
2018/04/21 Python
Python3使用turtle绘制超立方体图形示例
2018/06/19 Python
解决PyCharm同目录下导入模块会报错的问题
2018/10/13 Python
python 自动重连wifi windows的方法
2018/12/18 Python
Python Datetime模块和Calendar模块用法实例分析
2019/04/15 Python
解决python多行注释引发缩进错误的问题
2019/08/23 Python
将数据集制作成VOC数据集格式的实例
2020/02/17 Python
python 如何利用argparse解析命令行参数
2020/09/11 Python
html5简介及新增功能介绍
2020/05/18 HTML / CSS
全球最大的游戏市场:G2A
2018/07/05 全球购物
科室工作个人总结的自我评价
2013/10/29 职场文书
简单的大学生自我鉴定
2014/02/18 职场文书
企业管理毕业生求职信
2014/03/11 职场文书
MySQL 数据类型选择原则
2021/05/27 MySQL