代码之家  ›  专栏  ›  技术社区  ›  JohnB

LET/LAMBDA内部引入的INDEX函数和名称的性能问题

  •  0
  • JohnB  · 技术社区  · 2 年前

    Excel的 INDEX 当被索引的对象是在中引入的名称时,函数会显示奇怪的行为 LET 的构造或参数 LAMBDA 。在Windows和Mac上的行为是一致的。

    假设单元格 B2 包含公式

    =SEQUENCE(50000)
    

    那么以下公式都是相对有效的:

    =MAP(SEQUENCE(2000),LAMBDA(x,INDEX(B2#,x)))
    
    =LAMBDA(MAP(SEQUENCE(2000),LAMBDA(x,INDEX(B2#,x))))()
    
    =LET(mgen,LAMBDA(B2#),LAMBDA(MAP(SEQUENCE(2000),LAMBDA(x,INDEX(mgen(),x)))))()
    

    然而,以下公式非常缓慢

    =LET(m,B2#,MAP(SEQUENCE(2000),LAMBDA(x,INDEX(m,x))))
    
    =LET(m,B2#,LAMBDA(MAP(SEQUENCE(2000),LAMBDA(x,INDEX(m,x)))))()
    
    =LAMBDA(m,MAP(SEQUENCE(2000),LAMBDA(x,INDEX(m,x))))(B2#)
    

    阵列越长,性能问题就越严重 地下二层 是。当你在中用500000替换50000时,你可以用后3个公式破坏Excel 地下二层 ,而前三个公式仍然运行良好。

    请注意,的长度 地下二层 (索引的数组)理论上不应该对性能产生任何影响,因为 索引 在我所有的例子中被调用的次数完全相同。

    对我来说, 索引 当第一个参数没有直接引用工作表区域时,似乎会出现性能问题。

    然而,如果是这样的话——我如何有效地(在恒定时间内)获得LET/LAMBDA命名数组的第n个元素?

    我无法通过将索引数组写入单元格来解决此问题,因为在我的情况下,索引数组是另一个lambda的结果。

    编辑以澄清:的唯一目的 MAP / SEQUENCE(2000) 在我的示例中,构造是对进行2000次单独调用 索引 ,以便使性能差异变得明显。构造与问题完全无关。每当我做很多事情时,就会出现性能问题 索引 调用,其中第一个参数是LET/LAMDA名称。

    第二次编辑:然而,似乎需要某种古怪的结构来重现这个问题。我无法用2000个单独的 LET / 索引 2000个单元格中的公式。

    0 回复  |  直到 2 年前