Kdb 可以在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

我尝试从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 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代码实际上没有什么好处-最好还是坚持使用q

    A
    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