Python内存管理实例分析

作者:黑加仑王子 时间:2021-06-13 01:39:21 

本文实例讲述了Python内存管理。分享给大家供大家参考,具体如下:


a = 1

a是引用,1是对象。Python缓存整数和短字符串,对象只有一份,但长字符串和其他对象(列表字典)则有很多对象(赋值语句创建新的对象)。


from sys import getrefcount
a=[1,2,3]
print(getfrecount(a))

返回4,当使用某个引用作为参数传给getfrecount时,创建了临时引用,+1.

对象引用对象


class from_obj(object):
 def __init__(self, to_obj):
   self.to_obj = to_obj
b = [1,2,3]
a = from_obj(b)
print(id(a.to_obj))
print(id(b))
c = [b,b]

a引用对象b,c引用b两次。

通过objgraph包(之前安装xdot)梳理引用拓扑结构。


x = [1, 2, 3]
y = [x, dict(key1=x)]
z = [y, (x, y)]
import objgraph
objgraph.show_refs([z], filename='ref_topo.png')

Python内存管理实例分析

千万不要两个对象相互引用或自己引用自己,形成引用环给垃圾回收机制带来麻烦。

垃圾回收

回收引用计数为0的对象。垃圾回收时python不能做其他任务,降低效率,所以不是总随时都垃圾回收。python记录分配对象(object allocation)和取消分配对象(object deallocation),差值高于某阈值启动回收。


import gc
print(gc.get_threshold())

(700,10,10)700为启动阈值,两个10是分代回收相关阈值,通过set_threshold()重设。手动启用垃圾回收gc.collect()

分代回收

基本假设:存活越久越不可能变垃圾。

对象分0,1,2三代。新建对象0代,经过一次垃圾回收依然存活归为下一代。垃圾回收启动时一定扫描所有0代,如果0代经过一定次数垃圾回收,则扫0和1代,同理扫0,1和2代。(700,10,10)表明10次0代配合1次1代,10次1代配合1次2代。

孤立的引用环

Python内存管理实例分析

原本两表对象相互引用后删除引用,但对象引用计数部位0不会被回收。

则python复制每个对象引用计数,对某个对象i,遍历所有对象i引用的对象j,将gc_ref_j减1.

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

来源:https://www.cnblogs.com/blackprience/p/10659517.html

标签:Python,内存管理
0
投稿

猜你喜欢

  • Python跨文件全局变量的实现方法示例

    2021-05-26 08:13:23
  • IntelliJ IDEA连接MySQL数据库详细图解

    2024-01-13 13:18:38
  • 解决python有时候import不了当前的包问题

    2022-11-28 18:52:21
  • python实现黄金分割法的示例代码

    2022-08-27 19:41:17
  • 微信小程序 支付功能实现PHP实例详解

    2023-11-19 08:53:36
  • numpy给array增加维度np.newaxis的实例

    2023-06-30 06:41:34
  • 总结一些你可能不知道的ip地址

    2022-11-30 15:15:58
  • python同时遍历两个list用法说明

    2023-10-12 23:08:23
  • 解决mysql ERROR 1045 (28000)-- Access denied for user问题

    2024-01-24 01:30:43
  • python基础教程之获取本机ip数据包示例

    2022-09-28 13:31:45
  • 使用 Visual Studio Code(VSCode)搭建简单的Python+Django开发环境的方法步骤

    2022-03-03 10:04:54
  • 此数据库没有有效所有者,因此无法安装数据库关系图支持对象

    2024-01-16 15:23:27
  • Python实现去除列表中重复元素的方法总结【7种方法】

    2021-10-08 00:24:16
  • python超详细实现完整学生成绩管理系统

    2022-08-25 08:59:08
  • 使用Keras实现Tensor的相乘和相加代码

    2021-08-04 14:10:57
  • Python中的TCP socket写法示例

    2023-06-25 00:21:05
  • Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释

    2022-06-01 11:09:45
  • Facebook是如何设计的[译]

    2009-09-17 13:10:00
  • pandas 使用apply同时处理两列数据的方法

    2021-09-27 07:35:30
  • 解决numpy矩阵相减出现的负值自动转正值的问题

    2021-10-07 19:49:16
  • asp之家 网络编程 m.aspxhome.com