Kdb 可以在q脚本中编写k代码吗?
我尝试从q函数调用k的计数函数,但它给出了错误Kdb 可以在q脚本中编写k代码吗?,kdb,Kdb,我尝试从q函数调用k的计数函数,但它给出了错误 { "k)"# 1 2 3 4 5 //~ count 1 2 3 4 5 }[] 因此,我有以下问题: 1.可以在q脚本中编写k代码吗? 2.如果是,那么我们如何在q脚本中编写k代码?在q脚本/函数中使用k代码是否会使脚本/函数更加高效和优化 是的,这是可能的。我想你要找的是 这将对列表执行计数 就速度而言,对于像count这样的函数,这种影响似乎可以忽略不计 希望这能回答你的问题。一种方法是在k中定义整个函数: q)k)f:{# 1 2
{
"k)"# 1 2 3 4 5 //~ count 1 2 3 4 5
}[]
因此,我有以下问题:1.可以在q脚本中编写k代码吗?
2.如果是,那么我们如何在q脚本中编写k代码?在q脚本/函数中使用k代码是否会使脚本/函数更加高效和优化
希望这能回答你的问题。一种方法是在k中定义整个函数:
q)k)f:{# 1 2 3}
q)f
k){# 1 2 3}
q)f[]
3
除了EOIN和小册子方法外,还可以将字符串作为k代码执行:
q){a:"k" "|1 2 3";a}[]
3 2 1
q)
q){b:("k" "#:")1 2 3;b}[]
3
然而,将代码写成k代码实际上没有什么好处-最好还是坚持使用qA
k
函数可以在lambda中通过Terry列出的方法定义,或者一般来说,通过value
这样调用定义
q)mins
&\
q)foo:{[x] value "k)minner:&\\";minner x}
q)foo 1 2 3
1 1 1
事实上,您可以轻松创建一个简洁的小函数来创建k
函数
q)makeK:{[x;y]value "k)",string[x],"::",string[y]}
q)makeK[`minfoo;&\]
q)minfoo
&\
q)minfoo 1 2 3
1 1 1
Eoins应答是调用原语的k
功能的一种更简洁的方法。通常,用括号包装原语将调用k
功能
q)dict:`a`b`c!(1 2 3;1 2 3;1 2 3)
q)flip dict
a b c
-----
1 1 1
2 2 2
3 3 3
q)(+:) dict
a b c
-----
1 1 1
2 2 2
3 3 3
q)(+:)~flip
1b
不对。在lambda中定义k函数是非常可能的。见Terry或我的答案。谢谢@CallumBiggs。我对答案进行了编辑,以澄清这只是一种方法。计算时间的增加是从将函数解析为
k
开始的,并且随着计算变得更加密集,计算时间会很快变得可以忽略不计,比较count直到100000000
vs(#:)直到100000000
并且差额下降away@CallumBiggs-在一个项目的完整代码库中,可能有1000行代码和10000个函数,如first、where、reverse、string等。使用k代码代替q不会产生很大的差异吗?如果您只处理非常小的数据块,考虑到q是专为大客户设计的,生病的可能性不大Data@Utsav如果一个项目有1000行q代码,那么在k函数调用中保存几个字符不会显著改变占用空间。更有效的编码、改进的设计和代码的通用性/可重用性将极大地改变这一足迹。此外,使用嵌入在q中的k代码将使您的项目更难阅读、调试、维护和记录。只有少数情况下,我认为在q项目中使用k代码是合理的。至少这是我的观点,银行@Terrylynchi和CallumBiggs。
q)mins
&\
q)foo:{[x] value "k)minner:&\\";minner x}
q)foo 1 2 3
1 1 1
q)makeK:{[x;y]value "k)",string[x],"::",string[y]}
q)makeK[`minfoo;&\]
q)minfoo
&\
q)minfoo 1 2 3
1 1 1
q)dict:`a`b`c!(1 2 3;1 2 3;1 2 3)
q)flip dict
a b c
-----
1 1 1
2 2 2
3 3 3
q)(+:) dict
a b c
-----
1 1 1
2 2 2
3 3 3
q)(+:)~flip
1b