Python有堆栈/堆,内存管理方式如何?

时间:2013-01-27 09:47:37

标签: python memory memory-management

如何在Python中管理变量和内存?它是否有堆栈和堆以及用于管理内存的算法?鉴于这方面的知识,有关于大数据/数据处理的内存管理的建议吗?

2 个答案:

答案 0 :(得分:91)

  

如何在Python中管理变量和内存。

自动地!不,实际上,您只需创建一个对象,Python虚拟机就可以处理所需的内存以及将其放置在内存布局中的位置。

  

它是否有堆栈和堆以及用于管理的算法   存储器?

当我们谈论CPython时,它使用私有堆来存储对象。 From the CPython C API documentation

  

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

内存回收主要由引用计数处理。也就是说,Python VM保留一个内部日志,指出有多少引用引用了一个对象,并且当没有更多引用引用它时自动垃圾收集它。此外,通过检测试图查找所有可到达对象的对象a mechanism to break circular references的无法到达的“孤岛”,有somewhat in reverse of traditional GC algorithms(引用计数无法处理)。

注意: 请注意,此信息具体为 CPython 。其他python实现,例如pypyiron pythonjython和其他python实现可能在实现细节方面彼此不同,也可能与CPython不同。为了更好地理解,可能有助于理解Python语义(语言)和底层实现之间存在差异

  

鉴于这方面的知识有关于大数据/数据处理的内存管理的建议吗?

现在我不能谈论这个,但我确信NumPy(最流行的数字运算python库)具有优雅处理内存消耗的机制。

如果您想了解有关Python的Internals的更多信息,请查看以下资源:

答案 1 :(得分:42)

Python没有 任何 这样的东西。

Python是语言,并未指定实现必须如何实现Python语言定义的语义。

每个实现(CPython,PyPy,IronPython, Stackless ,Jython ......)都可以自由地做到这一点!

C Python中,所有对象都存在于堆上:

  

Python中的内存管理涉及包含所有Python对象和数据结构的私有堆。 1

CPython虚拟机基于堆栈:

>>> def g():
    x = 1
    y = 2
    return f(x, y)

>>> import dis
>>> dis.dis(g)
  2           0 LOAD_CONST           1 (1) # Push 1 onto the stack
              3 STORE_FAST           0 (x) # Stores top of stack into local var x

  3           6 LOAD_CONST           2 (2) # Push 2 onto stack
              9 STORE_FAST           1 (y) # Store TOS into local var y

  4          12 LOAD_GLOBAL          0 (f) # Push f onto stack
             15 LOAD_FAST            0 (x) # Push x onto stack
             18 LOAD_FAST            1 (y) # Push y onto stack
             21 CALL_FUNCTION        2     # Execute function with 2 
                                           # f's return value is pushed on stack
             24 RETURN_VALUE               # Return TOS to caller (result of f)

请记住,这是CPython特有的。但是,堆栈不包含实际值,它会保留对这些对象的引用。

1 Source