Python是否有堆栈/堆,并且如何管理内存?


91

如何在Python中管理变量和内存?它有堆栈和堆吗?用于管理内存的算法是什么?有了这些知识,对于大量/数据处理的内存管理有什么建议吗?



1
您在使用Python var /内存管理时是否遇到某些特定问题,而Python文档和/或Google却没有发现这些问题?
马丁·詹姆斯

Answers:


111

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

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

它有堆栈和堆吗?用于管理内存的算法是什么?

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

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

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

注意:请记住,此信息是CPython特定的。其他Python实现,比如pypyiron pythonjython当谈到自己的实现细节和其他人可能来自彼此之间以及与CPython的不同。为了更好地理解它,可能有助于理解Python的语义(语言)和底层实现之间的区别。

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

现在我不能谈论这个,但是我确定NumPy(用于数字运算的最受欢迎的python库)具有可以优雅地处理内存消耗的机制。

如果您想进一步了解Python的内部原理,请查看以下资源:


5
你们当中的好人强调了Python与CPython的区别;)
phant0m 2013年

1
请注意,局部变量会将实际变量存储在等效于堆栈框架中。
Marcin

1
Python不是Java。它没有虚拟机;它有一个翻译。指出这一点似乎很麻烦,但是它们是两个不同的范例,并且差异对于代码的编译和运行方式具有重要意义。stackoverflow.com/questions/441824/...
Apollo2020

48

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.