Does Python have a stack/heap and how is memory managed?

How are variables and memory managed in Python? Does it have a stack and a heap and what algorithm is used to manage memory? Given this knowledge are there any recommendations on memory management for large number/data crunching?

77499 次浏览

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

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

它是否有一个堆栈和一个堆,以及使用什么算法来管理 记忆?

当我们谈论 CPython时,它使用一个 私人堆来存储对象:

Python 中的内存管理涉及一个私有堆,其中包含所有 Python 对象和数据结构 堆由 Python 内存管理器在内部确保 内存管理器有不同的组件,它们处理各种 dynamic storage management aspects, like sharing, segmentation, 预分配或缓存。

内存回收主要由 参考计数处理。也就是说,Python VM 保存了一个内部日志,记录有多少引用引用了一个对象,并在没有更多引用引用时自动进行垃圾收集。此外,还有 打破循环引用的机制(引用计数不能处理) ,它通过检测不可到达的对象“岛”,somewhat in reverse of traditional GC algorithms试图找到所有可到达的对象。

注意: 请记住,此信息是 CPython特定的。其他 python 实现,如 pypyiron pythonjython和其他实现,在实现细节方面可能彼此不同,也不同于 CPython。为了更好地理解这一点,< strong > 可能有助于理解 Python 语义(语言)和底层实现之间的区别

有了这些知识,对于大数据/数据处理的内存管理有什么建议吗?

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

If you would like to know more about Python's Internals take a look at these resources:

Python 没有 任何这样的东西。

Python 是 语言,它没有指定 实施必须如何实现 Python 语言定义的语义。

每个实现(CPython、 PyPy、 IronPython、 堆积如山、 Jython...)都可以自由地做自己的事情!

CPython 中,all对象存在于堆中:

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

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 : < a href = “ http://docs.python.org/2/c-api/memory y.html”rel = “ noReferrer”> 来源