有人可以从 python 字节码解释 CALL_FUNCTION 和 RETURN_VALUE

2023-12-28

我试图理解 python 字节码,但我被抓住了CALL_FUNCTION and RETURN_VALUE.

函数有自己的堆栈吗?如果不是,文档中的“将 TOS 返回给函数的调用者”是什么意思?


In CPython every function gets its own stack, it's called a frame in CPython and it's an implementation-specific detail(very old one) and other implementation of Python like IronPython1 and Jython doesn't have this functionality or implement it differently.

为了澄清当我们说堆栈时涉及多个堆栈:

  1. Python堆栈:框架对象的堆栈
  2. Function values stack: The values in each frame object are stored in this stack to be operated on within the scope of this frame2
  3. C 堆栈:用于 C 函数调用

当一个函数被调用时,首先创建一个新的框架对象并将其放置在Python stack。该框架对象包含函数的代码对象、函数可以访问的全局变量以及存储在框架对象中的函数中定义的局部变量。

您可以获取当前帧Python堆栈 https://docs.python.org/3/library/inspect.html#inspect.stack and 当前帧 https://docs.python.org/3/library/inspect.html#inspect.currentframe使用检查模块中提供的实用程序。

问题是它是一个Python对象,它有自己的类型PyFrame_Type https://github.com/python/cpython/blob/456e27ac0ac6bc1cfd6da0191bd7802d8667457b/Objects/frameobject.c#L747,它获取引用计数(获取所有标头PyVarObject https://github.com/python/cpython/blob/456e27ac0ac6bc1cfd6da0191bd7802d8667457b/Include/object.h#L115)并消耗一些内存,如果我们有一系列函数调用,每次我们都会在整个堆的内存中创建这些帧对象。

在 Python 3.11 中,框架对象将被没有对象头的结构数组替换。框架对象仍然可用,但是仅当我们要求时 https://github.com/python/cpython/pull/27077 using inspect.currentframe() or sys._get_frame().


2 Function values stack

我们可以通过访问来检查函数的堆栈大小co_stacksize函数代码对象的属性,该值在编译时确定:

>>> def func():
...     a = 1
...     b = 2
...     c = 3
...     d = a + b + c
...
>>> func.__code__.co_stacksize
2

这里的值为 2,因为要求和a + b + c,它首先加载a and b在堆栈上(LOAD_FAST https://docs.python.org/3/library/dis.html#opcode-LOAD_FAST) 并执行求和(BINARY_ADD https://docs.python.org/3/library/dis.html#opcode-BINARY_ADD) 并将结果放回堆栈顶部,现在c被加载并与总和的结果相加a and b。因此,特定于此函数的堆栈需要的最大大小为 2。


1: The flag X:Frames can be used in IronPython to enable CPython like frame objects.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

有人可以从 python 字节码解释 CALL_FUNCTION 和 RETURN_VALUE 的相关文章

  • 将 saxon 与 python 结合使用

    我需要使用 python 处理 XSLT 目前我正在使用仅支持 XSLT 1 的 lxml 现在我需要处理 XSLT 2 有没有办法将 saxon XSLT 处理器与 python 一起使用 有两种可能的方法 设置一个 HTTP 服务 接受
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • 为 Anaconda Python 安装 psycopg2

    我有 Anaconda Python 3 4 但是每当我运行旧代码时 我都会通过输入 source activate python2 切换到 Anaconda Python 2 7 我的问题是我为 Anaconda Python 3 4 安
  • 使用带有关键字参数的 map() 函数

    这是我尝试使用的循环map功能于 volume ids 1 2 3 4 5 ip 172 12 13 122 for volume id in volume ids my function volume id ip ip 我有办法做到这一点
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 如何替换 pandas 数据框列中的重音符号

    我有一个数据框dataSwiss其中包含瑞士城市的信息 我想用普通字母替换带有重音符号的字母 这就是我正在做的 dataSwiss Municipality dataSwiss Municipality str encode utf 8 d
  • 根据列值突出显示数据框中的行?

    假设我有这样的数据框 col1 col2 col3 col4 0 A A 1 pass 2 1 A A 2 pass 4 2 A A 1 fail 4 3 A A 1 fail 5 4 A A 1 pass 3 5 A A 2 fail 2
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 是否可以忽略一行的pyright检查?

    我需要忽略一行的pyright 检查 有什么特别的评论吗 def create slog group SLogGroup data Optional dict None SLog insert one SLog group group da
  • Spark KMeans 无法处理大数据吗?

    KMeans 有几个参数training http spark apache org docs latest api python pyspark mllib html highlight kmeans pyspark mllib clus
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 添加不同形状的 numpy 数组

    我想添加两个不同形状的 numpy 数组 但不进行广播 而是将 缺失 值视为零 可能最简单的例子是 1 2 3 2 gt 3 2 3 or 1 2 3 2 1 gt 3 2 3 1 0 0 我事先不知道形状 我正在弄乱每个 np shape
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • 无法在 Python 3 中导入 cProfile

    我试图将 cProfile 模块导入 Python 3 3 0 但出现以下错误 Traceback most recent call last File
  • Jupyter Notebook 内核一直很忙

    我已经安装了 anaconda 并且 python 在 Spyder IPython 等中工作正常 但是我无法运行 python 笔记本 内核被创建 它也连接 但它始终显示黑圈忙碌符号 防火墙或防病毒软件没有问题 我尝试过禁用两者 我也无法
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • Statsmodels.formula.api OLS不显示截距的统计值

    我正在运行以下源代码 import statsmodels formula api as sm Add one column of ones for the intercept term X np append arr np ones 50

随机推荐