Numba 0.56.4设置cache=True导致程序二次运行崩溃求助
Numba 0.56.4中
cache=True导致二次运行崩溃的问题解决 你遇到的exit code -1073741819 (0xC0000005)是Windows系统下的内存访问冲突错误,根源在于Numba 0.56.x版本的缓存机制对递归函数的处理存在bug。你的代码中heapify是递归调用的函数,当启用cache=True时,首次编译的缓存产物在二次加载时会触发内存寻址错误,导致程序崩溃。
解决办法
1. 升级Numba版本
官方在Numba 0.57.0及后续版本中修复了递归函数缓存的相关问题,直接升级到最新稳定版就能解决这个问题。执行以下命令升级:
pip install --upgrade numba
2. 移除cache=True参数
如果暂时无法升级版本,直接去掉装饰器中的cache=True,放弃编译结果缓存。对于这类小型排序函数,重新编译的性能损耗几乎可以忽略。
3. 将递归实现改为迭代式
把递归的heapify改成迭代版本,避免触发Numba旧版本的递归缓存bug,同时保留cache=True的优势。修改后的代码如下:
from numba import njit import numpy as np @njit(cache=True) def heapify(arr: np.array, n: int, i: int): while True: largest = i # 初始化根节点为最大值索引 l = 2 * i + 1 # 左子节点索引 r = 2 * i + 2 # 右子节点索引 # 比较左子节点与当前最大值 if l < n and arr[i] < arr[l]: largest = l # 比较右子节点与当前最大值 if r < n and arr[largest] < arr[r]: largest = r # 如果最大值不是当前节点,交换并继续调整堆 if largest == i: break arr[i], arr[largest] = arr[largest], arr[i] i = largest @njit(cache=True) def heapSort(arr: np.array) -> np.array: n = len(arr) # 构建最大堆 for i in range(n // 2 - 1, -1, -1): heapify(arr, n, i) # 逐个取出堆顶元素并调整堆结构 for i in range(n - 1, 0, -1): arr[i], arr[0] = arr[0], arr[i] heapify(arr, i, 0) return arr data = np.random.random(5) print(data) o = heapSort(data) print(o)
内容的提问来源于stack exchange,提问作者Alex Sturt
相关产品推荐
相关产品推荐

