44 votes

Y a-t-il des avantages à utiliser l'interface Python / C au lieu de Cython?

Je veux prolonger python numpy et par l'écriture de certains modules en C ou en C++, à l'aide de BLAS et LAPACK. Je veux aussi être capable de distribuer le code de manière autonome bibliothèques C/C++. Je voudrais que cette bibliothèques à l'utilisation à la fois simple et double précision float. Quelques exemples de fonctions que je vais écrire sont du gradient conjugué pour la résolution des systèmes linéaires ou d'accélérer les méthodes de premier ordre. Certaines fonctions aurez besoin d'appeler une fonction Python à partir du code C/C++.

Après avoir joué un peu avec le Python/C de l'API et de l'Numpy/C de l'API, j'ai découvert que beaucoup de gens préconisent l'utilisation de Cython à la place (voir, par exemple, cette question ou cette une). Je ne suis pas un expert sur Cython, mais il semble que, pour certains cas, vous devez toujours utiliser le Numpy/C de l'API et de savoir comment il fonctionne. Compte tenu du fait que j'ai déjà (un peu) de connaissances sur le Python/C de l'API et aucun propos Cython, je me demandais si il est logique de le maintenir sur l'utilisation de Python/C de l'API, et si l'utilisation de cette API a certains avantages par rapport à Cython. Dans l'avenir, je vais certainement développer certaines choses n'impliquant pas de calcul numérique, de sorte que cette question n'est pas seulement à propos de numpy. L'une des chose que j'aime à propos de l'Python/C API est le fait que j'ai appris quelques trucs sur la façon de l'interpréteur Python est de travail.

Merci.

80voto

Stefan Behnel Points 461

Le courant "top réponse" sonne un peu trop comme l'ICS dans mes oreilles. Pour l'un, il n'est pas immédiatement évident que le Développeur Moyen serait d'écrire plus rapidement le code en C que ce NumPy+Cython vous donne de toute façon. Bien au contraire, le temps qu'il faut à même de recevoir le code C pour fonctionner correctement dans un environnement Python est généralement beaucoup mieux investi dans l'écriture d'un prototype rapide en Cython, l'analyse comparative il, pour optimiser celle-ci, à le réécrire de manière plus rapide, l'analyse comparative de nouveau, et ensuite décider si il n'y a rien qui a vraiment besoin de l'5 à 10% de plus de rendement que vous pouvez ou ne pouvez pas obtenir à partir de la réécriture de 2% du code dans la main à l'écoute C et l'appeler à partir de votre Cython code.

Je suis en train d'écrire une bibliothèque en Cython qui a actuellement environ 18K lignes de Cython code, qui se traduisent par près de 200 lignes de code C. Une fois, j'ai réussi à obtenir une vitesse de près de 25% pour un couple de très important interne de la base de fonctions de niveau, en y injectant quelques 20 lignes de la main-à l'écoute du code C dans les bons endroits. Il m'a fallu quelques heures à réécrire et à optimiser cette petite partie. C'est vraiment rien comparé à l'énorme quantité de temps que j'ai enregistré par le pas de l'écriture (et d'avoir à maintenir) la bibliothèque dans la plaine de C dans la première place.

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 va bénéficier tellement d'être écrite dans un langage de haut niveau, que vous pouvez jeter en arrière et investir la moitié du temps que vous avez enregistré dans la fabrication de votre code rapide, comme si vous l'aviez écrit dans un langage de bas niveau tout de suite.

Cela étant dit, votre commentaire que vous voulez "pour être en mesure de distribuer le code de manière autonome bibliothèques C/C++" est une raison valable pour coller à la plaine de C/C++. Cython dépend toujours Disponible, ce qui est tout à fait une dépendance. Cependant, l'utilisation du C/C++ (sauf pour le Python interface) ne vous permettra pas de profiter de NumPy, car il dépend aussi Disponible. Donc, comme d'habitude lors de l'écriture de quelque chose en C, vous aurez à faire beaucoup de travail de terrain avant d'accéder à la fonctionnalité réelle. Vous devriez sérieusement penser à deux fois avant de commencer ce travail.

10voto

Sven Marnach Points 133943

Tout d'abord, il y a un point dans votre question, je ne comprends pas:

[...] voulez aussi être en mesure de distribuer le code de manière autonome bibliothèques C/C++. [...] Certaines fonctions aurez besoin d'appeler une fonction Python à partir du code C/C++.

Comment cela est-il censé fonctionner?

Ensuite, comme à votre question, il y a certainement des avantages de l'utilisation de Python/C directement l'API:

  • Très probablement, vous êtes plus familier avec l'écriture de code en C que l'écriture Cython code.

  • L'écriture de votre code en C vous donne un maximum de contrôle. Pour obtenir les mêmes performances de Cython code de l'équivalent du code C, vous devez être très prudent. Vous aurez non seulement besoin de s'assurer de déclarer le type de toutes les variables, vous devez également définir certains drapeaux de manière adéquate -- juste un exemple est la vérification des limites. Vous aurez besoin de la connaissance intime de la façon dont Cython est de travailler pour obtenir les meilleures performances.

  • Cython dépend le code Python. Il ne semble pas être une bonne idée d'écrire du code qui doit être distribué de manière autonome la bibliothèque C en Cython

0voto

Adam Points 7110

Le principal inconvénient de l'API Python / C est qu'il peut être très lent s'il est utilisé dans une boucle interne. Je constate que l'appel d'une fonction Python nécessite un appel 80-160x à l'appel d'une fonction C ++ équivalente.

Si cela ne gêne pas votre code, vous pouvez alors écrire des fragments de code en Python, accéder aux bibliothèques Python et prendre en charge les rappels écrits directement en Python. Cela signifie également que vous pouvez effectuer certaines modifications sans recompiler, ce qui facilite le prototypage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X