Numba实时变量分析
Numba实时变量分析
Numba使用引用计数进行垃圾回收,这是一种需要编译器配合的技术。Numba IR对必须插入decref的位置进行编码。这些位置通过实时变量分析确定。相应的源代码是https://github.com/numba/numba/blob/master/numba/interpreter.py中的_insert_var_dels() 方法。
在Python语义中,一旦在函数内部定义了变量,该变量就一直存在,直到该变量被显式删除或函数作用域结束为止。但是,Numba会分析代码,以根据每个变量在编译期间的定义和用法来确定每个变量生命周期的最小范围。一旦变量不可访问,del就会在最接近的基本块(下一个块的开始或当前块的结尾)处插入一条指令。这意味着可以比常规Python代码更早地释放变量。
活动变量分析的行为会影响已编译代码的内存使用情况。在内部,Numba不会区分临时变量和用户变量。由于每个操作都会生成至少一个临时变量,因此,如果不尽快释放它们,函数可以累积大量的临时变量。我们的生成器实现可受益于早期释放变量,从而减小了在每个屈服点挂起的状态的大小。
有关实时变量分析的行为的注意事项
变量在定义前已删除
(相关问题:https : //github.com/numba/numba/pull/1738)
当变量生存期被限制在循环体内时(其定义和用法不会逃避循环体),例如:
def f(arr):
# BB 0
res = 0
# BB 1
for i in (0, 1):
# BB 2
t = arr[i]
if t[i] > 1:
# BB 3
res += t[i]
# BB 4
return res
变量t永远不会在循环外部被引用。甲del指令发出用于t在所述环路(BB 1)的头部被定义的变量之前。一旦知道了控制流程图,原因就很明显了:
变量t在BB 1中定义。在BB 2中,uses使用 t的评估t[i] > 1,执行错误分支的最后使用,然后转到BB1。在BB 3中,t is only used in res
+=
t[i],如果执行采用了错误分支,最后使用真正的分支。因为BB 3是BB 2的后续分支使用,所以必须在通用的前身中将其删除。最接近的点是BB 1,尚未从BB 0的输入边t定义。
如果t在BB 4处将其删除,仍将必须在定义变量之前将其删除,可以在不执行定义变量的循环体(BB 2和BB 3)的情况下执行BB4。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)