如何在Python中管理变量和内存?它有堆栈和堆吗?用于管理内存的算法是什么?有了这些知识,对于大量/数据处理的内存管理有什么建议吗?
Answers:
如何在Python中管理变量和内存。
自动地!不,实际上,您只是创建一个对象,Python虚拟机将处理所需的内存以及将其放置在内存布局中的位置。
它有堆栈和堆吗?用于管理内存的算法是什么?
当我们谈论CPython
它时,使用私有堆来存储对象。从CPython C API文档中:
Python中的内存管理涉及一个包含所有Python对象和数据结构的私有堆。此私有堆的管理由Python内存管理器在内部确保。Python内存管理器具有不同的组件,这些组件处理各种动态存储管理方面的问题,例如共享,分段,预分配或缓存。
内存回收主要通过引用计数来处理。也就是说,Python VM保留一个内部日志,记录有多少引用引用了一个对象,并在没有更多引用引用该对象时自动对其进行垃圾回收。此外,还有一种机制可以通过检测对象的不可达“孤岛” 来打破循环引用(引用计数无法处理),这与尝试查找所有可达对象的传统GC算法有些相反。
注意:请记住,此信息是CPython
特定的。其他Python实现,比如pypy
,iron python
,jython
当谈到自己的实现细节和其他人可能来自彼此之间以及与CPython的不同。为了更好地理解它,可能有助于理解Python的语义(语言)和底层实现之间的区别。
有了这些知识,对于大量/数据处理的内存管理有什么建议吗?
现在我不能谈论这个,但是我确定NumPy(用于数字运算的最受欢迎的python库)具有可以优雅地处理内存消耗的机制。
如果您想进一步了解Python的内部原理,请查看以下资源:
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:来源