问题描述
import numba
@numba.njit
def f(x,c):
for i in range(3):
if c == 0:
x += 1
elif c == 1:
x *= 2
else:
assert False
return x
print(f(3,0),f(3,1))
如果c
是一个较小的最终整数集(例如, 0 <= c <= 3
?
不允许将与if
有关的c
条件移出循环,因为这显然是一种优化。因为这是一个人工示例,所以在实际示例中,循环可能非常庞大,而且在体内仅更改了1-2行的情况下,重复两次循环是不可行的。
基本上,我想使c
的编译时常数。像C++一样,可以将编译时常量作为模板参数,并进行与此相关的所有代码优化。
所以我想告诉Numba,参数c0
,c1
等是编译时常量,应该以这样的方式进行处理:无论何时以不同的{{1}值调用函数} Numba应该创建并编译一个单独的函数实例,并进行必要的优化,就像c
在传递新的模板参数集时生成模板函数的每个实例一样。
换句话说,应该以某种方式在函数的签名中包含此类常量C++
的可能值,据我了解,Numba会为每个不同的签名生成单独的函数代码,就像C ++模板一样。
另一种需要优化的情况是,c
不是函数的参数,而是循环开始之前某些复杂表达式计算的结果。在这种情况下,结果c
也来自一小部分可能的值。通过创建一个接受c
作为参数的子函数,也许可以将这种情况转换为上述情况。
通常,我有一些嵌套循环,每个循环都有一些在循环运行之前计算的常数。然后在相应的循环内部,在c
条件中使用这些常量。如何迫使Numba进行优化,以将这些常量条件从这些循环体中移出。
您有什么建议?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)