# 7.7。实时变量分析
> 原文: [http://numba.pydata.org/numba-doc/latest/developer/live_variable_analysis.html](http://numba.pydata.org/numba-doc/latest/developer/live_variable_analysis.html)
(相关问题 [https://github.com/numba/numba/pull/1611](https://github.com/numba/numba/pull/1611) )
Numba 使用引用计数进行垃圾收集,这是一种需要编译器协作的技术。 Numba IR 编码必须插入减量的位置。这些位置由实时变量分析确定。相应的源代码是 [https://github.com/numba/numba/blob/master/numba/interpreter.py](https://github.com/numba/numba/blob/master/numba/interpreter.py) 中的`_insert_var_dels()`方法。
在 Python 语义中,一旦在函数内定义了变量,它就会一直存活,直到明确删除变量或结束函数作用域。但是,Numba 分析代码以通过其定义和编译期间的用法来确定每个变量的生命周期的最小界限。一旦变量无法访问,就会在最近的基本块(在下一个块的开头或当前块的末尾)插入`del`指令。这意味着变量可以比常规 Python 代码更早发布。
实时变量分析的行为会影响已编译代码的内存使用情况。在内部,Numba 不区分临时变量和用户变量。由于每个操作都生成至少一个临时变量,因此如果不尽快释放,则函数可以累积大量临时变量。我们的生成器实现可以从早期释放变量中受益,这减少了在每个屈服点处暂停的状态的大小。
## 7.7.1。关于实时变量分析行为的注释
### 7.7.1.1。定义前删除变量
(相关问题: [https://github.com/numba/numba/pull/1738](https://github.com/numba/numba/pull/1738) )
当变量生命周期被限制在循环体内时(它的定义和用法不会逃脱循环体),如:
```py
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`永远不会在循环外引用。在定义变量之前,在循环开头(BB 1)为`t`发出`del`指令。一旦我们知道控制流图,原因很明显:
```py
+------------------------------> BB4
|
|
BB 0 --> BB 1 --> BB 2 ---> BB 3
^ | |
| V V
+---------------------+
```
变量`t`在 BB 1 中定义。在 BB 2 中,`t[i] > 1`的评估使用`t`,如果执行采用假分支并转到 BB 1,则最后一次使用。在 BB 3 中,`t`仅为在`res += t[i]`中使用,如果执行采用 true 分支,这是最后一次使用。因为 BB 3,BB 2 的传出分支使用`t`,所以必须在共同的前任中删除`t`。最近的点是 BB 1,它没有从 BB 0 的入射边缘定义`t`。
或者,如果在 BB 4 处删除`t`,我们仍然必须在其定义之前删除变量,因为可以在不执行定义变量的循环体(BB 2 和 BB 3)的情况下执行 BB4。
- 1. 用户手册
- 1.1。 Numba 的约 5 分钟指南
- 1.2。概述
- 1.3。安装
- 1.4。使用@jit 编译 Python 代码
- 1.5。使用@generated_jit 进行灵活的专业化
- 1.6。创建 Numpy 通用函数
- 1.7。用@jitclass 编译 python 类
- 1.8。使用@cfunc 创建 C 回调
- 1.9。提前编译代码
- 1.10。使用@jit 自动并行化
- 1.11。使用@stencil装饰器
- 1.12。从 JIT 代码 中回调到 Python 解释器
- 1.13。性能提示
- 1.14。线程层
- 1.15。故障排除和提示
- 1.16。常见问题
- 1.17。示例
- 1.18。会谈和教程
- 2. 参考手册
- 2.1。类型和签名
- 2.2。即时编译
- 2.3。提前编译
- 2.4。公用事业
- 2.5。环境变量
- 2.6。支持的 Python 功能
- 2.7。支持的 NumPy 功能
- 2.8。与 Python 语义的偏差
- 2.9。浮点陷阱
- 2.10。 Python 2.7 寿命终止计划
- 3. 用于 CUDA GPU 的 Numba
- 3.1。概述
- 3.2。编写 CUDA 内核
- 3.3。内存管理
- 3.4。编写设备功能
- 3.5。 CUDA Python 中支持的 Python 功能
- 3.6。支持的原子操作
- 3.7。随机数生成
- 3.8。设备管理
- 3.10。示例
- 3.11。使用 CUDA 模拟器 调试 CUDA Python
- 3.12。 GPU 减少
- 3.13。 CUDA Ufuncs 和广义 Ufuncs
- 3.14。共享 CUDA 内存
- 3.15。 CUDA 阵列接口
- 3.16。 CUDA 常见问题
- 4. CUDA Python 参考
- 4.1。 CUDA 主机 API
- 4.2。 CUDA 内核 API
- 4.3。内存管理
- 5. 用于 AMD ROC GPU 的 Numba
- 5.1。概述
- 5.2。编写 HSA 内核
- 5.3。内存管理
- 5.4。编写设备功能
- 5.5。支持的原子操作
- 5.6。代理商
- 5.7。 ROC Ufuncs 和广义 Ufuncs
- 5.8。示例
- 6. 扩展 Numba
- 6.1。高级扩展 API
- 6.2。低级扩展 API
- 6.3。示例:间隔类型
- 7. 开发者手册
- 7.1。贡献给 Numba
- 7.2。 Numba 建筑
- 7.3。多态调度
- 7.4。关于发电机的注意事项
- 7.5。关于 Numba Runtime 的注意事项
- 7.6。使用 Numba Rewrite Pass 获得乐趣和优化
- 7.7。实时变量分析
- 7.8。上市
- 7.9。模板注释
- 7.10。关于自定义管道的注意事项
- 7.11。环境对象
- 7.12。哈希 的注意事项
- 7.13。 Numba 项目路线图
- 8. Numba 增强建议
- 9. 术语表