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实现,比如pypy,iron python,jython当谈到自己的实现细节和其他人可能来自彼此之间以及与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.