处理元组/列表时,Python的堆栈如何工作?

时间:2018-11-18 19:50:42

标签: python python-3.x stack python-internals pythoninterpreter

我在Python documentation中看到BUILD_TUPLE指令“创建一个从堆栈中消费计数项的元组,并将结果的元组推入堆栈。”

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

2 个答案:

答案 0 :(得分:2)

进一步@ juanpa.arrivillaga的答案,我第一次玩dis模块...

反汇编微不足道的功能可能是有益的:

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是(至少部分地)按照例如What does it mean that python is stack based?

答案 1 :(得分:1)

此答案专门适用于CPython,但是所有 CPython对象都位于private heap上。

  

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

     

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

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