从几年前的一个帖子中我发现了一些集成python和kdb的选项,即
最后两个似乎是目前唯一积极更新的人。我的问题是实际使用这些工具的任何(并且理想地尝试了几种)工具的人。根据您的经验,后两者中的哪一个更适合我。选择标准是(按此顺序)
如果我完全错过了符合我要求的工具,请告诉我。我知道提出类似问题的主题,但我正在寻找2017年的答案,而不是2015年。
答案 0 :(得分:4)
Exxeleron的qPython“是一个Python库,支持Python和kdb +进程之间的进程间通信。”虽然PyQ提供了相同的功能,但PyQ提供的不仅仅是IPC。
PyQ是一个在kdb +实例中运行的全功能Python解释器。对于Python程序员,PyQ提供了对kdb +数据的直接访问,而无需在q中编程。对于q程序员,PyQ可以轻松访问Python着名的丰富的计算和可视化库。
举一个例子,这里是用q:
写的线性插值函数inp
inp:{y[i]+(z-x i)*(deltas[y]%deltas x)1+i:x bin z}
它需要三个参数:x
和y
是已知数据点的坐标,z
是插值的x坐标。它返回插值的y坐标。可以使用纯Python语法在PyQ中编写相同的函数:
def inp(x, y, z):
slope = y.deltas / x.deltas
i = x.bin(z)
return y[i] + (z - x[i]) * slope[i+1]
如果您在q
中准备数据x:0.1*til 10
y:x - x * x
z:5?1f
并调用Python或q实现,您将得到相同的结果。在PyQ的Python提示符下,可以验证如下:
>>> inp(q.x, q.y, q.z) == q.inp(q.x, q.y, q.z)
True
当然,有经验的Python程序员不需要从头开始编写这样的函数,因为NumPy已经有numpy.interp,它可以做同样的事情。如果作为q程序员,你想从q使用numpy.interp,你只需要一个简单的包装器,在返回之前将结果转换为K
对象。这是在q)
提示
q)p)import numpy; from pyq import q, K
q)p)def inp2(x, y, z): return K(numpy.interp(z, x, y))
q)p)q.inp2 = inp2
现在,inp2
已准备就绪:
q)inp[x;y;z] ~ inp2(x;y;z)
1b
由于PyQ在kdb +内运行,因此它免费获得IPC实现。例如,我可以在端口8888打开与远程服务器的连接,并通过两行代码询问其本地时间:
>>> h = q.hopen('::8888')
>>> h('.z.P')
k('2017.07.07D17:15:19.261285000')
但是,大多数任务都可以在PyQ中完成而不需要任何IPC(甚至是复制),因为所有的kdb +数据都已经与Python代码处于同一个进程中。
为了涵盖OP的规则,关于易用性,qPython是一个纯Python库可能更容易安装,但PyQ编程通常更容易,因为它不需要单独的kdb +服务器。 PyQ documentation的质量与qPython的质量相当。 PyQ从版本3.0.1和Python 3.1开始提供python 3.x支持。目前(2017年),它正在使用Python 2.7,3.5和3.6进行主动测试。速度比较不公平,因为PyQ可以直接访问kdb +数据并且不需要IPC,因此它可以比qPython快100倍地完成许多任务。
免责声明:我是PyQ的作者。
答案 1 :(得分:1)
此kdb/python指南已于2017年更新:
对于其他需要Python库的人,我强烈推荐 exxeleron qpython库(虽然它确实需要numpy,哪个 要求2.6至少,我认为,这可能是一种限制)
答案 2 :(得分:1)
我已经相当广泛地使用了exxeleron qpython库,并且发现它是Python的一个很好的包< - > kdb + IPC。最后我记得,在发送到kdb +时,它存在序列化多字节字符(至少在Python 2.7中)的问题,因此我将字符串/符号转换为字节码并在{}}或{{ kdb +方。
这不是世界上最快的东西 - 它的de /序列化感觉不太快(至少在2.7中 - 我还没有在Python 3中测试过) - 但它是kdb + IPC的友好界面来自Python。它具有很好的子/ pub模型钩子(在连接对象上使用.receive),并且对于kdb +相关的东西(甚至还有一些很好的客户端示例用于pub / sub处理!)。
我没有使用pyQ进行测试,理论上它应该更好地用于计算繁重的工作,因为它在kdb +而不是在Python中尽可能多地工作,但是有时你可以将大部分工作卸载到kdb +进程并希望例如分析结果或使用Python特定的包(例如,对于NLP / ML等),qpython工作得很好。