Python是否有一个堆栈/堆,如何pipe理内存?
在Python中如何pipe理variables和内存? 它是否有堆栈和堆,以及使用什么algorithm来pipe理内存? 鉴于这些知识,有没有关于大量/数据处理的内存pipe理的build议?
如何在Python中pipe理variables和内存。
自动的! 不,实际上,您只需创build一个对象,Python虚拟机将处理所需的内存以及将其放置在内存布局中的位置。
它是否有堆栈和堆,以及使用什么algorithm来pipe理内存?
当我们谈论CPython
它使用私有堆来存储对象。 从官方的Python文档 :
Python中的内存pipe理涉及一个包含所有Python对象和数据结构的私有堆。 Python内存pipe理器在内部保证了这个私有堆的pipe理。 Python内存pipe理器具有不同的组件,可处理各种dynamic存储pipe理方面的问题,如共享,分割,预分配或caching。
用于垃圾收集的algorithm被称为引用计数 。 这就是Python虚拟机保持一个内部日志中有多less引用引用一个对象,并自动垃圾收集它时,没有更多的引用引用它。
注意:请记住,此信息是CPython
特定的。 其他python实现,例如pypy
, iron python
, jython
和其他python实现可能与CPython有所不同。 为了更好地理解, 可能有助于理解Python的语义(语言)和底层实现之间的区别
鉴于这些知识,有没有关于大量/数据处理的内存pipe理的build议?
现在我不能说这个了,但是我相信NumPy (用于数字运算的最stream行的python库)具有能够优雅地处理内存消耗的机制。
如果您想了解更多关于Python内部的知识,请查看这些资源:
- 逐步通过CPython (video)
- 关于Python虚拟机内部的介绍
- 在真正的黑客精神, Python对象分配器的源代码
Python没有任何这样的事情。
Python是语言 ,并没有指定具体实现如何实现Python语言定义的语义。
每个实现(CPython,PyPy,IronPython, Stackless ,Jython …)都可以自由地做自己的事情!
在C Python中, 所有对象都在堆上:
Python中的内存pipe理涉及一个包含所有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 : 来源