Python + Q (KDB) - 哪些工具易于使用且维护良好

Python + Q (KDB) - which tools are easy to use and well maintained

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

最后两个似乎是目前唯一积极更新的。我的问题是问那些实际使用这些工具中的任何一个(最好尝试过几种)的人。根据您的经验,后两种哪个更适合我。选择标准将是(按此顺序)

如果我完全错过了适合我要求的工具,请告诉我。我知道提出类似问题的线程,但我正在寻找 2017 年的答案,而不是 2015 年的答案。

kdb/python 指南于 2017 年更新:

For anyone else who needs a Python library, I am highly recommending the exxeleron qpython library (though it does require numpy, which requires 2.6 As a minimum, I believe, which can be a limitation)

我相当广泛地使用了 exxeleron qpython 库,发现它是 Python <-> kdb+ IPC 的一个很好的包。最后我记得,它在发送到 kdb+ 时序列化多字节字符(至少在 Python 2.7 中)存在问题,因此作为一种解决方法,我将 strings/symbols 转换为字节码并执行 `$`char$ 在 kdb+ 端。

这不是世界上最快的东西 - 它的 de/serialisation 感觉比它可能的速度要慢一些(至少在 2.7 中 - 我没有在 Python 3 中测试过) - 但是它是来自 Python 的 kdb+ IPC 的友好界面。它有很好的 sub/pub 模型挂钩(在连接对象上使用 .receive),并且对于与 kdb+ 相关的东西有相对较好的记录(甚至还有一些很好的 pub/sub 处理的客户端示例!)。

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

Exxeleron 的 qPython "is a Python library providing support for interprocess communication between Python and kdb+ processes." While the same functionality is available from 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} 

它需要三个参数:xy 是已知数据点的坐标,z 是插值的 x 坐标。它 returns 插值的 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 is comparable in quality to that of 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 的作者。