能否在Numba中使用Python locals()函数?报错问题咨询
问题解答
核心结论
Numba的njit(nopython模式)完全不支持locals()。原因很简单:nopython模式要求编译阶段就确定所有变量的类型和结构,而locals()是Python里动态操作局部变量的特性,根本没法被Numba的静态类型推断系统处理,这就是你碰到那个TypingError的根源。
解决方案:用容器替代动态变量
别再用locals()搞动态变量了,换成Numba支持的字典或列表来存数据就行,效果一样,还能正常加速。给你两种改写方式:
方案1:用字典(和原逻辑最接近)
import numba @numba.njit def make_variables(): vars_dict = {} for i in range(6, 9): vars_dict[f"my_variable_{i}"] = i for i in range(6, 9): res = vars_dict[f"my_variable_{i}"] + 2 yield res print(list(make_variables()))
方案2:用列表(性能更优)
既然你的变量后缀是连续数字,用列表比字典效率更高——Numba对列表的优化比字典好得多:
import numba @numba.njit def make_variables(): vars_list = [] for i in range(6, 9): vars_list.append(i) for val in vars_list: res = val + 2 yield res print(list(make_variables()))
额外提醒
- Numba的nopython模式只支持Python的一个子集,像
locals()、globals()这种动态特性都被砍掉了,就是为了换极致的性能。 - 要是你非想用动态特性,可以试试
numba.jit(不加nopython参数),但这会触发对象模式,基本没什么性能提升,不建议这么干。
内容的提问来源于stack exchange,提问作者Talleros
相关产品推荐
相关产品推荐

