# 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. 術語表