q kdb中子列表和Take运算符(#)的比较

时间:2019-05-27 10:51:41

标签: kdb

当我使用子列表或take运算符(#)时从表中获取数据的子集时,大多数情况下take运算符的速度要比子列表函数慢。

查询后发表评论的5条意见 hdb中的表t由231131行和71个列组成。

\t 10000 10 sublist select from t where date=.z.d-5 /Time taken - 62j 92j 68j  63j 65j 
\t 10000 10#select from t where date=.z.d-5 / Time taken - 544j 546j 567j 569j 585j

在这个小样本中,子列表似​​乎比take运算符要快。
但是,当我看到子列表的代码时,它在内部使用了take运算符,想知道子列表如何提高效率?

1 个答案:

答案 0 :(得分:6)

用于计时这些操作的语法意味着您正在计时两个不同的操作。

\t 10000 10 sublist select from t where date=.z.d-5 /Time taken - 62j 92j 68j  63j 65j

此子列表操作显示从第10000个条目开始的长度为10的切片。

\t 10000 10#select from t where date=.z.d-5 / Time taken - 544j 546j 567j 569j 585j

此#操作将返回10000行,每行包含select函数结果中的10行。

您可能想做的是:

\t:10000 10 sublist select from t where date=.z.d-5 /Time taken - 62j 92j 68j  63j 65j 
\t:10000 10#select from t where date=.z.d-5 / Time taken - 544j 546j 567j 569j 585j

将每个功能计时10000次。通过我自己的测试,子列表和#给出了相似的时间。