Exxeleron's qPython "est une bibliothèque Python prenant en charge la communication interprocessus entre les processus Python et kdb +." Alors que la même fonctionnalité est disponible à partir de PyQ, PyQ offre beaucoup plus que simplement IPC.
PyQ est un interpréteur Python complet fonctionnant à l'intérieur d'une instance kdb +.Pour un programmeur Python, PyQ donne un accès direct aux données kdb + sans avoir besoin de programmer en q. Pour un programmeur q, PyQ offre un accès facile à un riche ensemble de bibliothèques de calcul et de visualisation pour lesquelles Python est célèbre.
Pour donner un exemple, voici une fonction d'interpolation linéaire inp
écrit en q:
inp:{y[i]+(z-x i)*(deltas[y]%deltas x)1+i:x bin z}
Il prend trois arguments: x
et y
sont coordonnées des points de données connus et z
est x coordonnées du valeurs interpolées. Il renvoie les coordonnées y des valeurs interpolées. La même fonction peut être écrit en PYQ en utilisant la syntaxe pure Python:
def inp(x, y, z):
slope = y.deltas/x.deltas
i = x.bin(z)
return y[i] + (z - x[i]) * slope[i+1]
Si vous préparez les données q
x:0.1*til 10
y:x - x * x
z:5?1f
et appelez soit mise en œuvre Python ou q, vous obtiendrez le même résultat. À l'invite Python du PYQ ceci peut être vérifié comme suit:
>>> inp(q.x, q.y, q.z) == q.inp(q.x, q.y, q.z)
True
Bien sûr, un programmeur Python expérimenté aurait pas besoin d'écrire une telle fonction à partir de zéro, car NumPy a déjà numpy.interp qui fait la même chose et plus encore. Si, en tant que programmeur q, vous voulez utiliser numpy.interp depuis q, tout ce dont vous avez besoin est un simple wrapper qui convertit le résultat en objet K
avant de le renvoyer. Voici comment cela peut se faire à l'q)
invite
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
Et maintenant, inp2
est prêt à l'emploi:
q)inp[x;y;z] ~ inp2(x;y;z)
1b
Depuis PYQ fonctionne à l'intérieur KDB +, il obtient sa mise en œuvre IPC gratuitement. Par exemple, je peux ouvrir une connexion au serveur distant au port 8888 et demander son heure locale dans deux lignes de code:
>>> h = q.hopen('::8888')
>>> h('.z.P')
k('2017.07.07D17:15:19.261285000')
Cependant, la plupart des tâches peuvent être accomplies dans PYQ sans IPC (ou même copie) du tout parce que toutes vos données kdb + sont déjà dans le même processus que votre code Python. Pour couvrir les rubriques de l'OP, sur la facilité d'utilisation, qPython étant une pure bibliothèque Python peut être plus facile à installer, mais la programmation PyQ est souvent plus facile car elle ne nécessite pas de serveur kdb + séparé. PyQ documentation est de qualité comparable à celle de qPython. PyQ a offert le support de python 3.x depuis sa version 3.0.1 et Python 3.1. Actuellement (2017) il est activement testé avec Python 2.7, 3.5 et 3.6. La comparaison de vitesse ne serait pas juste parce que PyQ a un accès direct aux données kdb + et ne nécessite pas d'IPC, de sorte qu'il peut accomplir de nombreuses tâches 100 fois plus vite que qPython.
Avis de non-responsabilité: Je suis l'auteur de PyQ.
Votre "guide kdb/python" est incorrect par rapport aux versions Python supportées par [PyQ] (https://pyq.enlnt.com). PyQ a soutenu la série 3.x de Python depuis sa [version 3.0.1] (https://pyq.enlnt.com/whatsnew/changelog.html#pyq-3-0-1) qui a été libérée en 2012. –