我在Python documentation中看到BUILD_TUPLE
指令“创建一个从堆栈中消费计数项的元组,并将结果的元组推入堆栈。”
它真的推动了元组本身吗?如果元组包含大量元素怎么办?它如何放置在堆栈上?
答案 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运行时的实现细节。源代码被编译为字节码,然后在此基于堆栈的虚拟机上执行。