1

我在 Python文档中看到BUILD_TUPLE指令“从堆栈中创建一个消耗计数项的元组,并将生成的元组推入堆栈”。

它真的推动了元组本身吗?如果元组包含大量元素怎么办?它是如何放置在堆栈上的?

4

2 回答 2

2

在@juanpa.arrivillaga 的回答和我第一次玩这个dis模块之后……</p>

分解琐碎的功能可能是有益的:

def foo(a, b, c):
  return (a, b, c)

这导致:

  2           0 LOAD_FAST                0 (a)
              2 LOAD_FAST                1 (b)
              4 LOAD_FAST                2 (c)
              6 BUILD_TUPLE              3
              8 RETURN_VALUE

换句话说:我们确保堆栈顶部有正确的参数值,然后将它们全部弹出并用(引用)单个元组替换它们。

这就是stack machine的传统操作方式,我相信 CPython 是(至少部分)模仿的,例如,python 基于堆栈是什么意思?

于 2018-11-18T21:45:58.313 回答
1

这个答案特别适用于 CPython,但所有CPython 对象都存在于private heap上。

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

在最低级别,原始内存分配器通过与操作系统的内存管理器交互来确保私有堆中有足够的空间来存储所有与 Python 相关的数据。在原始内存分配器之上,几个特定于对象的分配器在同一个堆上运行,并实施适应每种对象类型特性的不同内存管理策略。例如,整数对象在堆内的管理方式与字符串、元组或字典不同,因为整数意味着不同的存储要求和速度/空间权衡。因此,Python 内存管理器将一些工作委托给特定于对象的分配器,但确保后者在私有堆的范围内运行。

注意, Python 中的一切都是对象。唯一进入解释器堆栈的是 PyObject 指针。这里的堆栈是 CPython 运行时的实现细节。源代码被编译成字节码,在这个基于堆栈的虚拟机上执行。

于 2018-11-18T20:28:44.550 回答