python内存管理分析

 更新时间:2015年04月08日 11:12:43   作者:huaweitman  
这篇文章主要介绍了python内存管理,较为详细的分析了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轻量级ORM框架Peewee访问sqlite数据库的方法详解

    Python轻量级ORM框架Peewee访问sqlite数据库的方法详解

    这篇文章主要介绍了Python轻量级ORM框架Peewee访问sqlite数据库的方法,结合实例形式较为详细的分析了ORM框架的概念、功能及peewee的安装、使用及操作sqlite数据库的方法,需要的朋友可以参考下
    2017-07-07
  • numpy矩阵乘法中的multiply,matmul和dot的使用

    numpy矩阵乘法中的multiply,matmul和dot的使用

    本文主要介绍了numpy矩阵乘法中的multiply,matmul和dot的使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-02-02
  • 如何清空python的变量

    如何清空python的变量

    在本篇文章里小编给大家分享的是关于清空python的变量的方法,有需要的朋友们可以学习下。
    2020-07-07
  • Python代码实现动图倒放

    Python代码实现动图倒放

    这篇文章主要介绍了Python代码实现动图倒放,文章通过利用gif动图实现倒放效果,具有一定的参考价值,需要的小伙伴可以参考一下,希望对你的学习有所帮助
    2022-03-03
  • Python操作Sqlite正确实现方法解析

    Python操作Sqlite正确实现方法解析

    我们今天将会在这篇文章中分步骤为大家详细介绍一下有关Python操作Sqlite的相关应用方式,希望大家可以从中获得一些帮助
    2020-02-02
  • 爬虫代理池Python3WebSpider源代码测试过程解析

    爬虫代理池Python3WebSpider源代码测试过程解析

    这篇文章主要介绍了爬虫代理池Python3WebSpider源代码测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-12-12
  • Tensorflow训练MNIST手写数字识别模型

    Tensorflow训练MNIST手写数字识别模型

    这篇文章主要为大家详细介绍了Tensorflow训练MNIST手写数字识别模型,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-02-02
  • 基于OpenCV实现小型的图像数据库检索功能

    基于OpenCV实现小型的图像数据库检索功能

    下面就使用VLAD表示图像,实现一个小型的图像数据库的检索程序。下面实现需要的功能模块,分步骤给大家介绍的非常详细,对OpenCV图像数据库检索功能感兴趣的朋友跟随小编一起看看吧
    2021-12-12
  • python利用urllib实现爬取京东网站商品图片的爬虫实例

    python利用urllib实现爬取京东网站商品图片的爬虫实例

    下面小编就为大家带来一篇python利用urllib实现爬取京东网站商品图片的爬虫实例。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-08-08
  • Python动态强类型解释型语言原理解析

    Python动态强类型解释型语言原理解析

    这篇文章主要介绍了Python动态强类型解释型语言原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03

最新评论