循环在字节码里

👁️ 3 人浏览 💬 0 人评论 ❤️ 添加收藏

(Python 自己就是「编译成字节码、由 VM 执行」:dis.get_instructions(f) 列出函数 f 的指令,每条有 opname(指令名)和 argval(操作数);f.__code__ 是代码对象,co_varnames 是局部变量名、co_argcount 参数个数、co_names 用到的全局名。不同 Python 版本的指令名会变,本节只看这些稳定的东西。)

一个 while 和一个没有循环的函数,各看有没有跳转、局部变量几个:

import dis


def loop(n):
    s = 0
    while n > 0:
        s = s + n
        n = n - 1
    return s


def straight(a):
    b = a * 2
    return b


def jumps(fn):
    return sum(1 for i in dis.get_instructions(fn) if "JUMP" in i.opname) > 0


print(str(jumps(loop)) + "/" + str(jumps(straight)) + "/" + str(len(loop.__code__.co_varnames)) + "/" + str(len(straight.__code__.co_varnames)) + "/" + str(loop(4)))
提交你的答案
请登录后提交答案。
去登录
代码编辑器
Ctrl + Enter 运行
本次输入:
输出:

                        
👩‍🏫
AI
💬 题目评论

全部评论