Y a-t-il des avantages à utiliser L'interface Python/C au lieu de Cython?
je veux étendre python et numpy en écrivant quelques modules en C ou C++, en utilisant BLAS et LAPACK. Je veux aussi être capable de distribuer le code comme des bibliothèques autonomes C/C++. J'aimerais que ces bibliothèques utilisent à la fois un flotteur de précision simple et un flotteur de précision double. Quelques exemples de fonctions que j'écrirai sont le gradient conjugué pour résoudre des systèmes linéaires ou des méthodes accélérées de premier ordre. Certaines fonctions devront appeler une fonction Python à partir du code C / C++.
après en jouant un peu avec L'API Python/C et L'API Numpy/C, j'ai découvert que beaucoup de gens préconisent L'utilisation de Cython à la place (voir par exemple cette question ou celle-ci ). Je ne suis pas un expert en Cython, mais il semble que pour certains cas , vous devez toujours utiliser L'API Numpy/C et savoir comment cela fonctionne. Étant donné que j'ai déjà (un peu) des connaissances sur L'API Python/C et aucune sur Cython, je me demandais s'il est logique de continuer à utiliser L'API Python/C, et si l'utilisation de cette API présente certains avantages par rapport à Cython. À l'avenir, je développerai certainement des choses qui n'impliquent pas l'informatique numérique, donc cette question n'est pas seulement sur numpy. Une des choses que j'aime à propos de L'API Python/C est le fait que j'apprends des choses sur le fonctionnement de L'interpréteur Python.
Merci.
3 réponses
D'abord, il y a un point dans votre question que je ne comprends pas:
[...] veulent aussi pouvoir distribuer le code comme bibliothèques autonomes C/C++. [...] Certaines fonctions devront appeler une fonction Python à partir du code C / C++.
Comment est-ce supposé fonctionner?
ensuite, en ce qui concerne votre question actuelle, il y a certainement des avantages à utiliser l'API Python/C directement:
-
très probablement, vous êtes plus familier avec l'écriture du code C que L'écriture du code Cython.
-
écrire votre code en C vous donne le contrôle maximum. Pour obtenir la même performance avec le code Cython qu'avec le code C équivalent, vous devez être très prudent. Vous n'aurez pas seulement besoin de vous assurer de déclarer les types de toutes les variables, vous aurez aussi à définir certains drapeaux de manière adéquate -- juste un exemple est vérification des limites . Vous aurez besoin de savoir comment Cython travaille pour obtenir la meilleure performance.
-
le code Cython dépend de Python. Il ne semble pas être une bonne idée d'écrire du code qui devrait également être distribué comme bibliothèque C autonome dans Cython
l'actuelle "top answer" sonne un peu trop comme du FUD dans mes oreilles. Pour un, il n'est pas évident immédiatement que le développeur moyen écrirait du code plus rapide en C que ce que NumPy+Cython vous donne de toute façon. Bien au contraire, le temps qu'il faut pour obtenir le code C nécessaire pour fonctionner correctement dans un environnement Python est généralement beaucoup mieux investi dans l'écriture d'un prototype rapide à Cython, le benchmarking it, l'optimisation it, la réécriture d'une manière plus rapide, le benchmarking IT à nouveau, et puis décider s'il y a quelque chose en elle qui nécessite vraiment la performance de 5-10% de plus que vous pouvez ou ne peut pas obtenir de réécrire 2% du code dans la main-accordé C et l'appeler à partir de votre code Cython.
j'écris une bibliothèque à Cython qui a actuellement environ 18K lignes de code Cython, ce qui se traduit à près de 200K lignes de code C. J'ai une fois réussi à obtenir une accélération de près de 25% pour un couple de très importantes fonctions internes de base, par injection d'une vingtaine de lignes de code C réglé à la main aux bons endroits. Il m'a fallu quelques heures pour réécrire et optimiser cette petite partie. Ce n'est vraiment rien comparé à l'énorme quantité de temps que j'ai économisé en n'écrivant pas (et en ayant à maintenir) la bibliothèque en C simple en premier lieu.
Même si vous savez, C beaucoup mieux que Cython, si vous connaissez Python et C, vous apprendrez Cython tellement vite qu'il vaut l'investissement dans tous les cas, en particulier lorsque vous êtes dans des objets numériques. 80-95% du code que vous écrivez bénéficiera tellement d'être écrit dans une langue de haut niveau, que vous pouvez en toute sécurité lay back et investir la moitié du temps que vous avez économisé dans la fabrication de votre code juste aussi vite que si vous l'aviez écrit dans une langue de bas niveau immédiatement.
cela dit, votre commentaire que vous voulez" être capable de distribuer le code comme des bibliothèques autonomes C/c++ " est une raison valable pour s'en tenir à C/C++. Cython dépend toujours de Disponible, ce qui est tout à fait une dépendance. Cependant, l'utilisation de C/C++ (à l'exception de L'interface Python) ne vous permettra pas non plus de profiter de NumPy, car cela dépend aussi de CPython. Donc, comme d'habitude quand vous écrivez quelque chose en C, vous devrez faire beaucoup de travail au sol avant d'arriver à la fonctionnalité réelle. Tu devrais sérieusement y réfléchir deux fois avant de commencer ce travail.
le principal inconvénient de L'API Python/C est qu'elle peut être très lente si elle est utilisée dans une boucle interne. Je vois que l'appel d'une fonction Python prend un coup de 80-160x sur l'appel d'une fonction C++ équivalente.
si cela ne dérange pas votre code, alors vous bénéficiez de pouvoir écrire quelques morceaux de code en Python, avoir accès aux bibliothèques Python, prendre en charge les callbacks écrits directement en Python. Cela signifie également que vous pouvez faire quelques changements sans recompiler, rendre le prototypage plus facile.