Python内存管理如何工作?

时间:2012-07-21 22:34:26

标签: python

好吧,我有一个类的概念,允许其他类在基础上导入类,而如果你使用它,你必须导入它。我将如何实施它?或者,Python解释器是否已经以某种方式执行此操作?它是否会破坏内存中未使用的类,以及如何?

我知道C ++ / C是非常面向内存的指针和所有这些,但是Python?而且我不是说我有问题;我或多或少想要为我的程序设计做一个修改。我想编写一个使用数百个类和模块的大型程序。但我担心如果我这样做,我会让应用程序陷入困境,因为我不了解Python如何处理内存管理。

我知道这是一个模糊的问题,但如果有人将我联系起来或指向正确的方向,我们将不胜感激。

5 个答案:

答案 0 :(得分:22)

Python - 比如C#,Java,Perl,Ruby,Lua和许多其他语言 - 使用垃圾收集而不是手动内存管理。您可以定期自由创建对象和语言的内存管理器(或者当您专门指向它时)查找程序不再引用的任何对象。

因此,如果您想要保留一个对象,只需保留对它的引用即可。如果您希望释放对象(最终)删除对它的任何引用。

def foo(names):
  for name in names:
    print name

foo(["Eric", "Ernie", "Bert"])
foo(["Guthtrie", "Eddie", "Al"])

foo的每次调用都会创建一个用三个值初始化的Python list对象。对于foo调用的持续时间,它们由变量names引用,但是一旦该函数退出,没有变量持有对它们的引用,并且它们是垃圾收集器要删除的公平游戏。

答案 1 :(得分:7)

阅读以下有关Python内存管理的文章:

Python : Memory Management

Exerpt :(例子可在文章中找到):

  

Python中的内存管理涉及包含所有内容的私有堆   Python对象和数据结构。这个私人的管理   Python内存管理器在内部确保堆。 Python   内存管理器有不同的组件处理各种   动态存储管理方面,如共享,细分,   预分配或缓存。

     

在最低级别,原始内存分配器确保存在   私有堆中有足够的空间来存储所有与Python相关的数据   与操作系统的内存管理器交互。在之上   原始内存分配器,几个特定于对象的分配器操作   在同一个堆上并实现不同的内存管理策略   适应每种物体类型的特殊性。例如,   整数对象在堆内的管理方式与字符串不同,   元组或字典,因为整数意味着不同的存储   要求和速度/空间权衡。因此,Python内存管理器   将一些工作委托给特定于对象的分配器,但是   确保后者在私有堆的范围内运行。

     

了解Python堆的管理非常重要   由解释器本身执行,并且用户没有   控制它,即使她经常操纵对象指针   该堆内的内存块。堆空间的分配   Python对象和其他内部缓冲区是按需执行的   Python内存管理器通过列出的Python / C API函数   这份文件。

答案 2 :(得分:3)

x =10
print (type(x))

内存管理器(MM):   x指向10

y = x
if(id(x) == id(y)):
        print('x and y refer to the same object')

(MM):   y指向同一个10对象

x=x+1
if(id(x) != id(y)):
    print('x and y refer to different objects')

(MM):   x指向另一个对象是11,先前指向的对象被销毁

z=10
if(id(y) == id(z)):
    print('y and z refer to same object')
else:
    print('y and z refer different objects')
  • Python内存管理分为两部分。
    1. 堆叠内存
    2. 堆内存
  • 在堆栈内存中创建方法和变量。
  • 对象和实例变量值在堆内存中创建。
  • 在堆栈内存中 - 每当方法和时创建堆栈帧 变量已创建。
  • 无论何时,这些堆栈帧都会被自动销毁 函数/方法返回。
  • Python有垃圾收集器的机制,只要变量和 函数返回,垃圾收集器清除死对象。

答案 3 :(得分:2)

我的5美分:

  1. 最重要的是,python只为引用的对象释放内存(不适用于类,因为它们只是容器或自定义数据类型)。同样,在python中,一切都是对象,因此int,float,string,[],{}和()都是对象。这意味着如果你的程序不再引用它们,它们就是垃圾收集的受害者。

  2. 虽然python使用'引用计数'和'GC'来释放内存(对于未使用的对象),但是这个空闲内存不会返回给操作系统(在windows中它的情况不同) 。这意味着空闲内存块只返回python解释器而不是操作系统。所以你的python进程最终将拥有相同的内存。但是,python将使用此内存分配给其他一些对象。

  3. http://deeplearning.net/software/theano/tutorial/python-memory-management.html

    给出了非常好的解释

答案 4 :(得分:1)

是的,它在python3中也有相同的行为