Python + Q (KDB) - 哪些工具易于使用且维护良好
Python + Q (KDB) - which tools are easy to use and well maintained
从几年前的一个线程中,我找到了一些集成 python 和 kdb 的选项,即
- qpt
- 丹的工具
- PyQ
- qPython
最后两个似乎是目前唯一积极更新的。我的问题是问那些实际使用这些工具中的任何一个(最好尝试过几种)的人。根据您的经验,后两种哪个更适合我。选择标准将是(按此顺序)
- 易于使用(我是 q 的新手,理想情况下我会在 python 中比在 q 中做更多的工作)
- 文档(似乎在任何 kdb 上都不是很好)
- python3.x支持
- 速度
如果我完全错过了适合我要求的工具,请告诉我。我知道提出类似问题的线程,但我正在寻找 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}
它需要三个参数:x
和 y
是已知数据点的坐标,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 的作者。
从几年前的一个线程中,我找到了一些集成 python 和 kdb 的选项,即
- qpt
- 丹的工具
- PyQ
- qPython
最后两个似乎是目前唯一积极更新的。我的问题是问那些实际使用这些工具中的任何一个(最好尝试过几种)的人。根据您的经验,后两种哪个更适合我。选择标准将是(按此顺序)
- 易于使用(我是 q 的新手,理想情况下我会在 python 中比在 q 中做更多的工作)
- 文档(似乎在任何 kdb 上都不是很好)
- python3.x支持
- 速度
如果我完全错过了适合我要求的工具,请告诉我。我知道提出类似问题的线程,但我正在寻找 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}
它需要三个参数:x
和 y
是已知数据点的坐标,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 的作者。