如何对大型时间排序表执行 msum 的前向版本,而不必反转顺序两次或应用接下来的 n 次?
t:([] val:1000000?1f);
t:update sym:(count i)?`AA`BB`CC from t;
t:update nextsums: msumfwd[100000;val] by sym from t;
所有这些选项都很慢:
msumfwd:{next reverse x msum reverse y}
msumfwd2:{(x)_ x msum y,x#0}
msumfwd3:{(neg x) xprev (x msum y)}
msumfwd4:{sum 1_(x) next\y}
如果你能比反向方法更快的话我会感到惊讶(反向方法很便宜,并且 msum 是内置的)。
我以为使用另一个内置插件会很快,但事实并非如此
q)tl:{1f\[sum x#y;(x _y,x#0)-y]};
q)exec a cor b from update a:tl[100000;val],b:msumfwd[100000;val] by sym from t
1f
基于 https://code.kx.com/q/ref/accumulators/#alternative-syntax
如果能更快一点就好了,但是可惜