Python内存管理机制

来源:互联网 发布:东莞广电网络多少兆 编辑:程序博客网 时间:2024/06/07 05:52

一、python内存

因为要调用while循环,循环内有temp变量,不清楚python是否会在每一轮循环结束后自动释放temp内存空间,做了一个内存测试,发现无论temp = none,还是del temp,只能销毁变量,无法完全释放内存空间。注:红色部分标出相同内存id。

[python] view plain copy
  1. >>> for i in range(3):  
  2.     temp = i  
  3.     print temp,id(temp)  
0 36666732
1 36666720
2 36666708
[python] view plain copy
  1. >>> for i in range(4,7):  
  2. <span style="white-space:pre">    </span>temp = i  
  3. <span style="white-space:pre">    </span>print temp,id(temp)  
  4. <span style="white-space:pre">    </span>temp = None  
4 36666684
5 36666672
6 36666660
[python] view plain copy
  1. >>> for i in range(7,10):  
  2.     temp = i  
  3.     print temp,id(temp)  
  4.     del temp  
7 36666648
8 36666636
9 36666624
[python] view plain copy
  1. >>> a = 1  
  2. >>> id(a)  
36666720

[python] view plain copy
  1. >>> b = 5  
  2. >>> id(b)  
36666672
[python] view plain copy
  1. >>> c = 8  
  2. >>> id(c)  
36666636
测试完毕后删除c可以看到,变量c和temp确实被销毁,只是他们指向的引用值仍然会在内存中存在。直至窗口关闭才自动释放,人工无法干预。
[plain] view plain copy
  1. >>> del c  

[plain] view plain copy
  1. >>> id(c)  
  2.   
  3. Traceback (most recent call last):  
  4.   File "<pyshell#14>", line 1, in <module>  
  5.     id(c)  
  6. NameError: name 'c' is not defined  
  7. >>> id(temp)  
  8.   
  9. Traceback (most recent call last):  
  10.   File "<pyshell#15>", line 1, in <module>  
  11.     id(temp)  
  12. NameError: name 'temp' is not defined  
  13. >>> id(5)  
  14. 36666672  
  15. >>> id(10)  
  16. 36666612  
  17. >>> id(100000)  
  18. 41708736  
  19. >>> id("1234")  
  20. 46118528  
  21. >>> d = "1234"  
  22. >>> id(4)  
  23. 36666684  

二、内存池机制

查看了相关的博客,更深一步了解python内存机制

Python的内存机制以金字塔行,-1,-2层主要有操作系统进行操作,

  第0层是C中的malloc,free等内存分配和释放函数进行操作;

  第1层和第2层是内存池,有Python的接口函数PyMem_Malloc函数实现,当对象小于256K时有该层直接分配内存;

  第3层是最上层,也就是我们对Python对象的直接操作;

在 C 中如果频繁的调用 malloc 与 free 时,是会产生性能问题的.再加上频繁的分配与释放小块的内存会产生内存碎片. Python 在这里主要干的工作有:

  如果请求分配的内存在1~256字节之间就使用自己的内存管理系统,否则直接使用 malloc.

  这里还是会调用 malloc 分配内存,但每次会分配一块大小为256k的大块内存.

  经由内存池登记的内存到最后还是会回收到内存池,并不会调用 C 的 free 释放掉.以便下次使用.对于简单的Python对象,例如数值、字符串,元组(tuple不允许被更改)采用的是复制的方式(深拷贝?),也就是说当将另一个变量B赋值给变量A时,虽然A和B的内存空间仍然相同,但当A的值发生变化时,会重新给A分配空间,A和B的地址变得不再相同


而对于像字典(dict),列表(List)等,改变一个就会引起另一个的改变,也称之为浅拷贝


原创粉丝点击