使用Numba @njit装饰器时,无print语句函数结果异常求助
Numba @njit 装饰器下注释 print 语句导致计算结果异常的问题
我在用numba.njit编译器加速一个带循环的函数时遇到了诡异情况:
- 当函数带
@njit装饰器且内部保留print语句,或者完全不使用装饰器时,能得到正确结果; - 但注释掉装饰器函数内的
print语句后,输出结果就会出错(我已经通过函数外的独立代码验证了预期结果的正确性)。
通用代码部分
import numpy as np from numba import njit P, A, G = 1/2.22, 0.3, 2. T_grid = np.linspace(1e-10, 1, 101) z_grid = np.array([0.98306027, 0.98474125, 0.98642511, 0.98811184, 0.98980146, 0.99005298])
待加速函数实现
@njit def initial_guesses(P, A, G, T_grid, z_grid, T_idx=16): # 设置循环固定参数 z_grid_size = len(z_grid) T = T_grid[T_idx] # 初始化存储计算结果的向量 v = -1e10 * np.ones((z_grid_size)) for z_idx in range(z_grid_size): l = (z_grid[z_idx] / (1. + T))**(1. / P) c = (z_grid[z_idx] / (1. + T))**((1. + P) / P) g = T * c if (g >= 1e-10) and (c - (l**(1. + P))/(1. + P) >= 1e-10): u = A * (g**(1. - G) / (1. - G)) + \ (1. - A) * ((c - ((l**(1. + P)) / (1. + P)))**(1. - G) / (1. - G)) # print(np.maximum(v[z_idx], u)) v[z_idx] = np.maximum(v[z_idx], u) return v
不同场景下的输出
- 注释
print语句时的错误输出:
array([-1., -1., -1., -1., -1., -1.])
- 保留
print语句时的正确预期输出:
array([-7.03544442, -6.99684645, -6.95846025, -6.92028464, -6.88231847, -6.87669001])
预期结果验证代码
我用以下独立代码验证了预期结果,其输出和带print的jit函数、无装饰器函数的结果完全一致:
z_grid_size = len(z_grid) T = T_grid[16] v_2 = -1e10 * np.ones(z_grid_size) for z_idx in range(z_grid_size): l = (z_grid[z_idx] / (1. + T))**(1. / P) c = (z_grid[z_idx] / (1. + T))**((1. + P) / P) g = T * c if (g >= 1e-10) and (c - (l**(1. + P))/(1. + P) >= 1e-10): u = A * (g**(1. - G) / (1. - G)) + \ (1. - A) * ((c - ((l**(1. + P)) / (1. + P)))**(1. - G) / (1. - G)) v_2[z_idx] = np.maximum(v_2[z_idx], u) print(v_2)
请问有人知道这一现象的原因吗?
内容的提问来源于stack exchange,提问作者santos_umn
相关产品推荐
相关产品推荐

