114

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

4

2 回答 2

130

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

自动!不,实际上,您只需创建一个对象,Python 虚拟机就会处理所需的内存以及它应该放置在内存布局中的什么位置。

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

当我们谈论CPython它时,它使用私有堆来存储对象。从 CPython C API 文档

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

内存回收主要通过引用计数来处理。也就是说,Python VM 会在内部记录有多少引用引用了一个对象,并在没有更多引用引用它时自动对它进行垃圾收集。此外,还有一种机制可以通过检测无法到达的对象“孤岛”来中断循环引用(引用计数无法处理),这与试图找到所有可到达对象的传统 GC 算法有些相反。

注意:请记住,此信息是CPython特定的。其他 python 实现,例如pypy、和其他实现细节可能彼此不同,并且与 CPython 不同iron pythonjython为了更好地理解这一点,理解 Python 语义(语言)和底层实现之间存在差异可能会有所帮助

鉴于这些知识,对于大量/数据处理的内存管理是否有任何建议?

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

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

于 2013-01-27T09:55:17.797 回答
60

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来源

于 2013-01-27T11:06:03.213 回答