【问题标题】:How does Python interpreter allocate memory for different methods?Python解释器如何为不同的方法分配内存?
【发布时间】:2016-08-15 07:57:16
【问题描述】:

谁能告诉我 Python 解释器或 PVM 如何管理以下代码的内存?

class A(object):
    class_purpose = "template"
    def __init__(self):
        self.a = 0.0
        self.b = 0.0

    def getParams(self):
        return self.a, self.b

    @classmethod
    def getPurpose(cls):
        return cls.class_purpose

    @staticmethod
    def printout():
        print "This is class A"

当我保存这个类并运行一些与这个类相关的代码时,PVM 或 Python 解释器如何存储类变量、类/静态函数和实例变量?我曾经是一名 C++ 程序员。我想知道那些“东西”存储在哪里(我知道 Python 只使用堆)?它们是何时存储的,RunTime 还是在 RunTime 之前?

比如我在初始化这个类之后运行这段代码:

a = A()
a.getParams()
A.getPurpose()
A.printout()

Python 解释器如何在这段代码后面分配内存?

【问题讨论】:

  • CPython 倾向于只使用堆(可能只使用堆),但这不是语言规范要求。你不应该假设它(也不应该重要)。
  • 由于您来自 C++ 并且可以阅读 C,因此您可能需要查看 Python 源代码以了解其工作原理。例如the byte code interpreter.
  • @poke 谢谢。这是一个很好的建议。我将阅读 CPython 代码以了解更多信息。由于 CPython 不是很容易理解,所以需要一段时间才能抓住核心。你有什么关于 CPython 解释的书推荐吗?
  • 并非如此,因为 CPython 都是“实现细节”,除了源代码本身之外,没有真正好的文档。首先阅读有关C API 的内容可能会有所帮助,因为这可以让您更深入地了解一些内部结构。

标签: python python-2.7 python-internals


【解决方案1】:

您的示例中的所有内容都只是一个对象。所有对象都在堆上。

类对象是在运行时创建的,并且具有从属性名称到对象的映射,您在类主体中定义的所有名称都是简单的属性。这些对象中的大多数都实现了descriptor protocolclass_purpose 属性除外)。构成大多数属性的函数对象也是在运行时创建的;编译器生成的所有代码对象都是存储字节码的代码对象、一些常量(由代码创建的任何不可变的东西,包括更多用于嵌套范围的代码对象)。

有关这些对象如何相互关联的更多详细信息,请参阅datamodel reference documentation

绝大多数 Python 开发人员不必担心内存管理。如果您针对Python C API 进行开发,您可能需要阅读Memory Management section,它确实声明:

理解 Python 堆的管理是由解释器本身执行的,并且用户无法控制它,即使她经常操作指向堆内内存块的对象指针,这一点很重要。 Python 对象和其他内部缓冲区的堆空间分配由 Python 内存管理器通过本文档中列出的 Python/C API 函数按需执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 2018-01-23
    • 1970-01-01
    • 2018-05-20
    • 2012-01-22
    • 1970-01-01
    • 2023-04-02
    相关资源
    最近更新 更多