44 votes

Y a-t-il des avantages à utiliser l'interface Python/C plutôt que Cython?

Je veux étendre Python et numpy en écrivant quelques modules en C ou C++, en utilisant BLAS et LAPACK. Je veux également pouvoir distribuer le code en tant que bibliothèques C/C++ autonomes. J’aimerais que ces bibliothèques utilisent à la fois des nombres flottants en simple et double précision. Certains exemples de fonctions que j'écrirai sont le gradient conjugué pour la résolution de systèmes linéaires ou des méthodes d'ordre un accélérées. Certaines fonctions devront appeler une fonction Python depuis le code C/C++.

Après avoir joué 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 de Cython, mais il semble que pour certains cas, vous devez encore utiliser l'API Numpy/C et savoir comment elle fonctionne. Étant donné que j'ai déjà (un peu) de connaissances sur l'API Python/C et aucune sur Cython, je me demandais s'il avait du sens 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 ne concernant pas le calcul numérique, donc cette question ne concerne pas seulement numpy. Une des choses que j'apprécie avec l'API Python/C est le fait que j'apprends des choses sur le fonctionnement de l'interpréteur Python.

Merci.

80voto

Stefan Behnel Points 461

La réponse actuelle "top answer" me semble un peu trop proche de la désinformation à mon avis. Pour commencer, il n'est pas immédiatement évident que le Développeur Moyen écrirait un 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 en Cython, le benchmarking, l'optimisation, la réécriture d'une manière plus rapide, le re-benchmarking, et ensuite décider s'il y a vraiment quelque chose dedans qui nécessite les 5-10% de performances supplémentaires que vous pouvez ou non obtenir en réécrivant 2% du code en C optimisé à la main et en l'appelant depuis votre code Cython.

Je suis en train d'écrire une bibliothèque en Cython qui compte actuellement environ 18 000 lignes de code Cython, ce qui se traduit par près de 200 000 lignes de code C. J'ai réussi une fois à obtenir une amélioration de presque 25% pour quelques fonctions internes très importantes, en injectant une vingtaine de lignes de code C optimisé à la main aux bons endroits. Il m'a fallu quelques heures pour réécrire et optimiser cette petite partie. C'est vraiment rien comparé à la quantité de temps énorme que j'ai économisée en n'écrivant pas (et en devant maintenir) la bibliothèque en C pur dès le début.

Même si vous connaissez C beaucoup mieux que Cython, si vous connaissez Python et C, vous apprendrez Cython si rapidement que cela vaut vraiment l'investissement dans tous les cas, surtout lorsque vous travaillez dans le domaine numérique. 80-95% du code que vous écrivez bénéficiera tellement du fait d'être écrit dans un langage de haut niveau que vous pouvez vous détendre en investissant la moitié du temps économisé à rendre votre code aussi rapide que si vous l'aviez écrit immédiatement dans un langage de bas niveau.

Cela étant dit, votre commentaire selon lequel vous voulez "pouvoir distribuer le code en tant que bibliothèques C/C++ autonomes" est une raison valable de rester sur du C/C++ pur. Cython dépend toujours de CPython, ce qui est une dépendance assez importante. Cependant, l'utilisation de C/C++ pur (à l'exception de l'interface Python) ne vous permettra pas non plus de bénéficier de NumPy, car cela dépend également de CPython. Donc, comme d'habitude lorsque vous écrivez quelque chose en C, vous devrez faire beaucoup de travail préliminaire avant d'en arriver à la fonctionnalité réelle. Vous devriez sérieusement réfléchir à deux fois avant de commencer ce travail.

10voto

Sven Marnach Points 133943

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

[...] aussi vouloir distribuer le code sous forme de bibliothèques C/C++ autonomes. [...] Certaines fonctions devront appeler une fonction Python à partir du code C/C++.

Comment cela est censé fonctionner?

Ensuite, en ce qui concerne votre question actuelle, il y a certainement des avantages à utiliser directement l'API Python/C :

  • Il est probable que vous soyez plus familier avec l'écriture de code C qu'avec l'écriture de code Cython.

  • Écrire votre code en C vous donne un contrôle maximal. Pour obtenir les mêmes performances à partir du code Cython que du code C équivalent, vous devrez être très prudent. Vous devrez non seulement vous assurer de déclarer les types de toutes les variables, mais vous devrez également définir certains drapeaux de manière adéquate - un exemple est la vérification des limites. Vous aurez besoin d'une connaissance intime de la façon dont Cython fonctionne pour obtenir les meilleures performances.

  • 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é sous forme de bibliothèque C autonome en Cython)

0voto

Adam Points 7110

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 constate qu'appeler une fonction Python prend un ralentissement de 80 à 160 par rapport à l'appel d'une fonction équivalente en C++.

Si cela ne pose pas de problème à votre code, vous bénéficiez de la possibilité d'écrire certains morceaux de code en Python, d'avoir accès aux bibliothèques Python, de prendre en charge des rappels écrits directement en Python. Cela signifie également que vous pouvez apporter des modifications sans recompiler, facilitant ainsi 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