Python numexpr:临时变量还是重复的子表达式?
如果同一子表达式出现在一个numexpr表达式中的多个位置,它是否会被重新计算多次(或者numexpr是否足够聪明,能够检测并重用结果) 有没有办法在numexpr表达式中声明临时变量?这将有两个目标:Python numexpr:临时变量还是重复的子表达式?,python,numpy,optimization,refactoring,numexpr,Python,Numpy,Optimization,Refactoring,Numexpr,如果同一子表达式出现在一个numexpr表达式中的多个位置,它是否会被重新计算多次(或者numexpr是否足够聪明,能够检测并重用结果) 有没有办法在numexpr表达式中声明临时变量?这将有两个目标: 鼓励NoNeXPR考虑缓存和重用,而不是重新计算结果; 简化表达式(使源代码更易于阅读和维护) 我试图计算f(g(x)),其中f和g本身都是复杂的表达式(例如,对于基于像素的专题分类,f是一个包含多个阈值的嵌套决策树,g是一组归一化的差异比率,x是一个多波段光栅图像)。是,如果子表达式在nume
我试图计算f(g(x)),其中f和g本身都是复杂的表达式(例如,对于基于像素的专题分类,f是一个包含多个阈值的嵌套决策树,g是一组归一化的差异比率,x是一个多波段光栅图像)。是,如果子表达式在numexpr表达式中重复,则不会重新计算它 这可以通过将
numexpr.evaluate(expr)
替换为numexpr.discomble(numexpr.numexpr(expr))
来验证
例如,表达式“where(x**2>0.5,0,x**2+10)”
被编译成如下内容:
y = x*x
t = y>0.5
y = y+10
y[t] = 0
(注意乘法只出现一次,而不是两次。)
因此,最好将整个计算作为单个numexpression输入。避免在python中执行子计算(将中间结果或临时变量分配到numpy数组中),因为这只会增加内存使用量并破坏numexpr的优化/加速(这与在CPU缓存大小的块中执行完整的计算序列以避免内存延迟有关)
尽管如此,通过使用字符串替换可以格式化更可读的代码:
f = """where({g} > 0.5,
0,
{g} + 10)"""
g = "x**2"
expr = f.format(g=g)