Python有堆栈/堆吗?内存是如何管理的?

Python有堆栈/堆吗?内存是如何管理的?,python,memory,memory-management,Python,Memory,Memory Management,Python如何管理变量和内存?它有堆栈和堆吗?使用什么算法来管理内存?有了这些知识,对于大容量/数据处理的内存管理有什么建议吗 如何在Python中管理变量和内存 自动的!不,实际上,您只需要创建一个对象,Python虚拟机就可以处理所需的内存以及它在内存布局中的位置 它有堆栈和堆吗?使用什么算法来管理 记忆 当我们谈论CPython时,它使用私有堆来存储对象: Python中的内存管理涉及一个包含所有 Python对象和数据结构。这家私营企业的管理 堆由Python内存管理器在内部确保。巨蟒

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

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

自动的!不,实际上,您只需要创建一个对象,Python虚拟机就可以处理所需的内存以及它在内存布局中的位置

它有堆栈和堆吗?使用什么算法来管理 记忆

当我们谈论
CPython
时,它使用私有堆来存储对象:

Python中的内存管理涉及一个包含所有 Python对象和数据结构。这家私营企业的管理 堆由Python内存管理器在内部确保。巨蟒 内存管理器有不同的组件,用于处理各种 动态存储管理方面,如共享、细分、, 预分配或缓存

内存回收主要由引用计数来处理。也就是说,PythonVM保留一个内部日志,记录引用一个对象的引用数量,并在没有更多引用引用时自动对其进行垃圾收集。此外,还有(引用计数无法处理的)通过检测对象的不可到达“孤岛”,试图找到所有可到达的对象

注意:请记住此信息是特定于CPython的。其他python实现,如
pypy
ironpython
jython
等,在实现细节上可能彼此不同,也可能与CPython不同。为了更好地理解这一点,了解Python的语义(语言)和底层实现之间的差异可能会有所帮助

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

现在我不能谈论这一点,但我确信(最流行的用于数字处理的python库)具有优雅地处理内存消耗的机制

如果您想更多地了解Python的内部结构,请参阅以下参考资料:

  • (视频)
  • 在真正的黑客精神下

    • Python没有任何类似的东西

      Python是一种语言,它没有指定实现必须如何准确地实现Python语言定义的语义

      每个实现(CPython、PyPy、IronPython、Stackless、Jython…)都可以自由地做自己的事情

      在CPython中,所有对象都位于堆上:

      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:

      您可能想了解以下两个方面:Python var/内存管理是否存在一些特定的问题,这些问题是您遇到的,并且不是通过Python文档和/或谷歌搜索发现的?很好,您强调了Python与CPython的区别;)注意,局部变量将实际变量存储在堆栈框架的等价物中;它没有虚拟机;它有一个翻译。指出这一点似乎有些迂腐,但它们是两种不同的范式,这种差异对代码的编译和运行方式具有重要影响。