字节码分析是调优JIT热点触发的起点,需用dis定位真实热点基本块、按执行特征反推阈值参数,并结合缓存策略锁定高价值函数;重点观察JUMP_ABSOLUTE等指令,统计基本块频次,满足60次/100ms且平均耗时>40μs即达Tier 1候选条件。

字节码分析是调优 JIT 热点触发行为的起点,不是为了改代码,而是让 JIT “看得清、判得准、编得稳”。关键在于把执行热度信号显性化、结构化,再结合运行时反馈动态校准阈值。
用 dis 定位真实热点基本块
Python 的 dis 模块能暴露函数内部执行流细节,比单纯看函数调用次数更贴近 JIT 实际优化单元。JIT 关注的是“某段字节码被反复执行”,比如循环体内的 LOAD_FAST → BINARY_ADD → STORE_FAST 这一串指令是否高频回边。
- 对目标函数执行
dis.dis(func),重点观察JUMP_ABSOLUTE、POP_BLOCK、FOR_ITER等控制流指令出现的位置 - 用
dis.get_instructions(func)获取每条指令的偏移与参数,统计各基本块(basic block)在采样周期内的执行频次 - 若发现某 3–5 行字节码在 100ms 内被执行超 60 次,且平均耗时 > 40μs,就符合 Python 3.14 Tartan JIT 的 Tier 1 候选条件
按执行特征反推并调整阈值参数
JIT 的默认阈值(如 50 次/100ms)是通用设定,但你的业务逻辑可能有偏差:I/O 等待长、计算密集短、或存在突发批量调用。这时需用字节码行为反推合理阈值。
- 若某函数每次调用只执行一次循环,但单次耗时 200μs,可适当降低
min_avg_us(例如设为 30_000),避免因“平均时间不够”被漏判 - 若某数据处理函数在批处理中被连续调用 100 次,但每次都在不同上下文(类型/对象结构不一致),应提高
hot_calls阈值(如设为 80),防止因类型不稳定频繁触发去优化 - 调用
sys.set_jit_thresholds()后,所有未编译帧的计数器重置,适合在批处理开始前统一校准
结合缓存策略锁定高价值函数
字节码分析后识别出的热点,未必都值得升到 Tier 2 编译——要优先保障稳定、小体积、高复用的函数进入深度优化流水线。
- 筛选字节码长度 CALL_FUNCTION_EX 或深层嵌套
GET_ITER的函数,它们更可能通过 Tier 1 并稳定驻留缓存 - 用环境变量
PYTHON_JIT_MAX_FUNCTIONS=512限制驻留数量,配合PYTHON_JIT_CACHE_POLICY=lfu,让高频字节码块优先保留在缓存中 - 若某函数经字节码分析确认为纯计算型(无 I/O、无反射、无
__getattr__),可在其定义前加装饰器@jit.compile(tier=2, stable=True)(需启用实验标记),跳过自动判定阶段
验证优化是否真正生效
不要只依赖日志里有没有 “compiled” 字样,要看机器码是否实际接管执行。
- 启用
PYTHON_JIT_LOG=1,检查输出中是否出现对应函数名 +tier=2+status=optimized - 对比同一负载下解释执行与 JIT 执行的
time.perf_counter_ns()差值,若提升不足 1.5×,说明可能被降级或未命中优化路径 - 用
sys.get_jit_stats()查看该函数的deopt_count是否为 0;若大于 0,需回查字节码中是否存在类型分支(如COMPARE_OP后接多路POP_JUMP_IF_TRUE)


















