Python内存机制,python基于值的自动内存管理方式-

  Python内存机制,python基于值的自动内存管理方式?

  文章1.1可变和不可变对象1.2 Python垃圾收集(1)垃圾收集(2)标记清除和分代收集1.3 Python内存池参考1.1可变和不可变对象从一个简单的面试问题开始:list和tuple的区别

  您可以添加、修改、插入和删除列表集中的元素。从下面的例子可以看出,并不要求列表中的每个元素都必须是相同的数据类型。

  list=[1, abc]

  Print(list) # output [1, abc]在元组集中,一个元素一旦被存储,以后就不能修改或删除。这比列表集安全多了,能使用tuple就用tuple。

  复习:不可变对象:数值字符串的元组;变量对象:字典列表列表字节数组。

  1.2 Python垃圾收集在Python中一切都是对象,Python中的存储问题也是对象的存储问题。python变量不允许指定类型,程序员也不需要关心内存管理,因为有Python内存管理器:Python内存池垃圾收集机制。

  (1)垃圾收集垃圾收集主要以引用计数为主。缺点:不能解决对象的“循环引用”,需要额外的空间来维护引用计数。参考计数发生变化:

  下面四种情况,一个对象的引用计数1:对象被创建(a=11),对象被引用(b=a),对象作为参数传递给func(a),对象作为元素存储在容器中(比如lst1=[a,a])。下面四种情况,对象的引用计数-1:对象的别名被显式销毁del a,对象的别名被赋予一个新的对象a=66,一个对象离开它的作用域(比如fun函数执行后,fun中的局部变量,注意全局变量不会),对象所在的容器被销毁或者对象#!/usr/bin/python

  ## -*-编码:utf-8 -*-

  导入系统

  定义函数(c):

  print( in func func ,sys.getrefcount(c)-1)

  print (init ,sys.getrefcount(11)-1)

  a=11

  print(在a=11 -之后,sys.getrefcount(11)-1)

  b=a

  print(在b=a -之后,sys.getrefcount(11)-1)

  Func(11) #在调用函数中为2:另一个引用是函数栈保存参数对参数的引用。

  print (after func(11) -,sys.getrefcount(11)-1)

  lst1=[a,12,14]

  print(在lst1=[a,12,14] -,sys.getrefcount(11)-1之后)

  a=666

  print(在a=666 -之后,sys.getrefcount(11)-1)

  德尔阿

  print(在del a -之后,sys.getrefcount(11)-1)

  德尔湾

  print(在del b - 之后,sys.getrefcount(11)-1)

  del lst1

  print (after del lst1-,sys.getrefcount (11)-1)的结果为

  初始化50

  在a=11 - 51之后

  在b=a - 52之后

  在功能函数54中

  在func(11) - 52之后

  在lst1=[a,12,14] - 53之后

  a=666 - 52后

  在del a - 52之后

  在del b - 51之后

  Dellst 1-50 (2)标记清除和分代回收垃圾收集机制主要是以引用机制为主,标记清除和分代回收机制为辅。标记清除机制(Mark-clear mechanism):用于解决计数引用导致的循环引用导致内存无法释放的问题(循环引用只能在容器对象中产生,如字典、元组、列表等。);在标记阶段,遍历所有对象。如果它是可到达的,即仍然有对象引用它,则该对象被标记为可到达的清理阶段,并再次遍历该对象。如果发现一个对象没有被标记为不可达,那么它将被分代回收。回收机制:提高垃圾收集效率。1.3 Python内存池Python内存管理器除了典型的垃圾收集机制之外,还有Python内存池。下图是CPython(Python解释器)的内存架构图:

  Python的对象管理主要位于1级~ 3级:python的内置对象(如int、dict等)都有独立的私有内存池。),而且对象之间的内存池是不共享的,即int释放的内存不会分配给float使用2级:当应用的内存大小小于256KB时,内存分配主要由Python的对象分配器(1级)实现:当请求的内存大小大于256KB时,由Python的原生内存分配器分配,本质上是调用C标准库中的malloc/realloc等函数。至于释放内存,当一个对象的引用计数变成0时,Python会调用它的析构函数。调用析构函数并不意味着最终会调用free来释放内存空间。如果是这样,频繁的申请和释放内存空间会大大降低Python的执行效率。因此,析构函数中也采用了内存池机制,从内存池中申请的内存会被返回到内存池中,避免频繁的申请和释放动作。

  参考[1] Python的内存管理机制:引入计数、垃圾收集和内存池机制。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: