2017-04-24 81 views
1

從一個線程約會幾年前,我發現了一些選項,以整合Python和KDB,即的Python + Q(KDB) - 該工具易於使用和維護良好

  • QPT
  • 丹的工具
  • PYQ
  • qPython

最後兩個似乎是在目前動態更新唯一的。我的問題是那些實際使用這些工具(並且最好嘗試了幾種)的人。根據你的經驗,後兩者中的哪一個更適合我。選擇標準是(按順序)

  • 易用性(我是新來的Q,理想情況下,我會做在python更多的工作比Q)
  • 文檔(似乎是任何東西一般不是很大KDB)
  • 蟒蛇3.x的支持
  • 速度

如果我完全錯過了一個工具,它符合我的要求,請讓我知道。據我所知,引發類似的問題線程,但我找了2017年的答案,而不是2015年

回答

0

kdb/python指南進行了更新2017年:

爲別人誰需要一個Python庫,我高度推薦 我已經使用了exxeleron qpython庫相當廣泛的exxeleron qpython庫(儘管它確實需要numpy的,這 需要2.6作爲最低限度,我相信,這可能是一個限制)

+0

對於[PyQ](https://pyq.enlnt.com)支持的Python版本,您的「kdb/python指南」不正確。 PyQ自2012年發佈[版本3.0.1](https://pyq.enlnt.com/whatsnew/changelog.html#pyq-3-0-1)以來支持3.x系列Python。 –

1

,並已發現這對Pyth來說是一個很好的包在< - > kdb + IPC。最後我回想起來,在發送到kdb +時,它對序列化多字節字符(至少在Python 2.7中)有問題,所以作爲解決方案,我將字符串/符號轉換爲字節碼,並在k​​db +端執行`$`char$。 (至少在2.7版本中 - 我還沒有在Python 3中測試過) - 但它是一個友好的界面,可以通過kdb +來自Python的IPC。對於sub/pub模型(在連接對象上使用.receive),它有很好的鉤子,並且對於kdb +相關的東西(甚至有一些很好的客戶端發佈/子處理示例!

我還沒有用pyQ進行過測試,理論上它應該更適合做計算繁重的工作,因爲它儘可能在kdb +而不是Python中執行,但是當您可以將大部分工作卸載到一個kdb +進程並想要例如分析結果或使用Python特定的軟件包(例如,NLP/ML等)qpython運行得非常好。

+0

謝謝。對於我來說,使用方便性對速度來說肯定更重要。我現在正在玩qpython,我很喜歡它 – chrise

2

Exxeleron的qPython「是一個Python庫,爲Python和kdb +進程之間的進程間通信提供支持。」儘管PyQ提供了相同的功能,但PyQ提供的不僅僅是IPC。

PyQ是一個運行在kdb +實例內的全功能Python解釋器。對於Python程序員來說,PyQ可以直接訪問kdb +數據,而無需在q中編程。對於q程序員來說,PyQ提供了一個可以輕鬆訪問Python着名的豐富的計算和可視化庫。

舉一個例子,這裏是一個線性插值函數inp寫入問:

inp:{y[i]+(z-x i)*(deltas[y]%deltas x)1+i:x bin z} 

它有三個參數:xy是已知數據點的座標和z是的x座標內插值。它返回插值值的y座標。同樣的功能可以在PYQ使用純Python語法來寫:

​​

如果您在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的rubrics,在易用性上,qPython作爲一個純Python庫可能更容易安裝,但是PyQ編程通常更簡單,因爲它不需要單獨的kdb +服務器。質量與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的作者。

+0

你可能想要求支持PyQ的版本在這裏更新,因爲它在這裏只顯示2.7。 http://www.timestored。com/kdb-guides/python-api 另外,安裝鏈接似乎沒有更新 – chrise

+0

我不確定我應該聯繫誰。我在上面的Ryan Hamilton的回答下留言,但他沒有迴應。我會嘗試TimeStored網站上的「聯繫我們」表單。 –

+0

親愛的亞歷山大,在過去的幾周裏我一直在使用qPython,這是我第一次聽說PyQ。由於速度是必須的,我很想切換到PyQ。但我有幾個問題。 在文檔的我似乎無法找到任何關於sub/pub機制。由於我有幾個回調函數是由訂閱觸發的,所以我想知道:使用PyQ這個可能嗎?其次:我正在Docker容器中使用kdb +實例。切換到PyQ時,這仍然是可能的嗎? 在此先感謝,PyQ看起來好吃;) –