Python+Q(KDB)哪些工具易于使用和维护

2024-10-01 13:36:58 发布

您现在位置:Python中文网/ 问答频道 /正文

从几年前的一个线程中,我发现了一些集成python和kdb的选项,即

  • qpt公司
  • 丹的工具
  • PyQ公司
  • qPython公司

最后两个似乎是目前唯一积极更新的。我的问题要问那些实际使用(并且最好尝试过几种)这些工具的人。从你的经验来看,后两种比较适合我。选择标准将是(按顺序)

  • 易用性(我对q不熟悉,理想情况下我会用python做比q更多的工作)
  • 文档(在kdb上似乎不太好)
  • python 3.x支持
  • 速度

如果我完全错过了符合我要求的工具,请告诉我。我知道有一些类似的问题,但我要的是2017年的答案,而不是2015年。在


Tags: 工具文档标准顺序选项情况公司经验
3条回答

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和{}是已知数据点的坐标,z是插值值的x坐标。它返回插值的y坐标。可以使用纯Python语法在PyQ中编写相同的函数:

^{pr2}$

如果你准备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程序员,你想使用numpy.INTP公司在q中,您只需要一个简单的包装器,在返回结果之前将结果转换为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与{a5}的质量相当。PyQ从3.0.1和python3.1版本开始就提供了python3.x支持。目前(2017年),它正在积极测试Python2.7、3.5和3.6。速度比较是不公平的,因为PyQ可以直接访问kdb+数据,并且不需要IPC,所以它可以比qPython快100倍完成许多任务。在

免责声明:我是PyQ的作者。在

我已经相当广泛地使用了exxeleron qpython库,并发现它是Python<;->;kdb+IPC的一个不错的包。最后我记得,在发送到kdb+时,它存在序列化多字节字符(至少在python2.7中)的问题,因此作为一种解决方法,我将字符串/符号转换为字节码,并在kdb+端执行`$或{}。在

它不是世界上最快的东西-它的反序列化感觉比它可能的要慢一些(至少在2.7版本中-我还没有在Python3中测试过),但它是从Python到kdb+IPC的友好接口。它对于sub/pub模型有很好的钩子(在connection对象上使用.receive),并且对于与kdb+相关的东西也有相对完善的文档记录(甚至还有一些很好的发布/订阅处理客户端示例!)。在

我还没有用pyQ测试过,理论上它应该更适合做计算量大的工作,因为它尽可能多地用kdb+而不是Python,但是当您可以将大部分工作卸载到kdb+进程中,并希望分析结果或使用Python特定的包(例如NLP/ML等)时,qpython可以很好地工作。在

本指南于2017年更新:

^{bq}$

相关问题 更多 >