Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python numexpr:临时变量还是重复的子表达式?_Python_Numpy_Optimization_Refactoring_Numexpr - Fatal编程技术网

Python 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

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

有没有办法在numexpr表达式中声明临时变量?这将有两个目标:

鼓励NoNeXPR考虑缓存和重用,而不是重新计算结果;<李>
  • 简化表达式(使源代码更易于阅读和维护)

  • 我试图计算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)