繁体   English   中英

numexpr:临时变量还是重复的子表达式?

[英]numexpr: temporary variables or repeated sub-expressions?

如果同一个子表达式出现在一个numexpr表达式中的多个位置,是否会多次重新计算(或者numexpr足够聪明以检测到这一点并重用结果)?

有什么方法可以在numexpr表达式中声明临时变量? 这将有两个目标:

  1. 鼓励numexpr考虑缓存和重用而不是重新计算结果;
  2. 简化表达式(使源代码更易于阅读和维护)。

我正在尝试计算f(g(x)) ,其中fg本身都是复杂的表达式(例如,对于基于像素的主题分类, f是包含多个阈值的嵌套决策树, g是一组归一化的差异比率,并且x是多波段光栅图像)。

是的,如果子表达式在numexpr表达式中重复,则不会重新计算它。

这可以通过将numexpr.evaluate(expr)替换为numexpr.disassemble(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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM