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实现,例如pypyiron pythonjython和其他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来源