web-dev-qa-db-fra.com

Python: Swig vs ctypes

En Python, dans quelles circonstances constitue un meilleur choix que CTTYPES pour appeler des points d'entrée dans des bibliothèques partagées? Supposons que vous n'ayez pas déjà le ou les fichiers d'interface Swig.

[.____] Quelles sont les métriques de performance des deux?

54
Kevin Little

J'ai une riche expérience d'utiliser Swig. Swig affirme qu'il s'agit d'une solution rapide pour envelopper des choses. Mais dans la vraie vie ...


Les inconvénients:

Swig est développé pour être général, pour tout le monde et plus de 20 langues. Généralement, cela conduit à des inconvénients:
- Configuration des besoins (Swig .Je modèles), parfois c'est délicat,
[.____] - manque de traitement de certains cas spéciaux (voir python propriétés plus loin),
[.____] - Manque de performance pour certaines langues.

Python Inconvénients:

1) Incooussement de style de code . C++ et python ont des styles de code très différents (qui est évident, certainement), les possibilités d'une scène de la fabrication de CODE cible plus de pythonish est très limitée. Comme exemple, c'est le cœur de Butt Butt Créez des propriétés à partir de getters and Setters. Voir CE Q & A

2) manque de large communauté . Swig a une bonne documentation. Mais si on a attrapé quelque chose qui n'est pas dans la documentation, il n'y a aucune information du tout. Aucun blog ni googling aide. Donc, on doit creuser fortement le code généré de Swig dans de tels cas ... c'est terrible, je pourrais dire ...

Avantages:

  • Dans des cas simples, il est vraiment rapide, facile et droit

  • Si vous avez produit des fichiers d'interface Swig une fois, vous pouvez envelopper ce code C++ à n'importe laquelle des autres langues plus de 20+ (!!!).

  • Une grande préoccupation à propos de Swig est une performance. Étant donné que la version 2.04 Swig comprend un drapeau "-Builtine", ce qui rend Swig encore plus rapidement que d'autres façons automatisées d'emballage. Au moins quelques points de repère montre ceci.


Quand utiliser Swig?

J'ai donc conclu pour moi deux cas lorsque la Swig est bonne à utiliser:

2) Si l'on doit envelopper CODE C++ pour plusieurs langues . Ou si potentiellement, il pourrait y avoir une heure où on doit distribuer le code pour plusieurs langues. L'utilisation de Swig est fiable dans ce cas.

1) Si l'on doit rapidement enveloppe , il suffit de plusieurs fonctionne de certains C++ Bibliothèque pour une utilisation finale.


Expérience en direct

Mise à jour :
[.____] C'est une année et demie passée alors que nous faisions une conversion de notre bibliothèque en utilisant Swig.

Tout d'abord, nous avons fait un python Version. Il y avait plusieurs moments quand nous avons connu des problèmes avec Swig - c'est vrai. Mais maintenant, nous avons élargi notre bibliothèque à Java et .net. Nous avons donc 3 langues avec 1 swig. Et je pourrais dire que Swig Rocks En termes de sauvegarde de beaucoup de temps.

Mise à jour 2 :
[.____] C'est deux ans, car nous utilisons Swig pour cette bibliothèque. Swig est intégré à notre système de construction. Récemment, nous avons eu un changement d'API majeur de la bibliothèque C++. Swig a parfaitement travaillé. La seule chose que nous devions faire est d'ajouter plusieurs% de renommée des fichiers .i afin notre CppCamelStyleFunctions() maintenant looks_more_pythonish en python. Je suis d'abord préoccupé par certains problèmes qui pourraient survenir, mais rien ne s'est mal passé. C'était incroyable. Juste plusieurs modifications et tout distribuées dans 3 langues. Maintenant, je suis convaincu que c'était une bonne solution pour utiliser Swig dans notre cas.

Mise à jour 3 :
[.____] Il est plus de 3 ans que nous utilisons Swig pour notre bibliothèque. changement majeur : python partie a été totalement réécrit dans python pur. La raison est que Python est utilisé pour la majorité des applications de notre bibliothèque maintenant. Même si la version pure python fonctionne plus lentement que C++ emballage, il est plus pratique pour les utilisateurs de travailler avec python pur, pas en difficulté avec des bibliothèques indigènes.

Swig est toujours utilisé pour .NET et Java versions.

La question principale ici "utiliserions-nous Swig for python si nous avons commencé le projet depuis le début?". Nous allons! Swig nous a permis de distribuer rapidement notre produit à de nombreuses langues. Cela a fonctionné pour un période de temps qui nous a permis de mieux comprendre les exigences de nos utilisateurs.

89
MajesticRa

CTYPES est très cool et beaucoup plus facile que Swig, mais il a l'inconvénient qui mal ou malveillant - écrit python code peut effectivement planter le python processus. Vous devriez considère également boost python. IMHO C'est en fait plus facile que Swig tout en vous donnant plus de contrôle sur la finale python Interface. Si vous utilisez ce que vous utilisez de toute façon. Si vous utilisez ce que vous utilisez de toute façon. Ajoutez d'autres langues à votre mix.

13
David Nehme

Dans mon expérience, CTTPES a un gros inconvénient: lorsque quelque chose ne va pas (et il sera invariablement pour toutes les interfaces complexes), c'est un enfer de déboguer.

Le problème est qu'une grande partie de votre pile est masquée par CTTPES/FFI Magic et il n'est pas facile de déterminer comment vous êtes arrivé à un point particulier et pourquoi les valeurs de paramètres sont ce qu'ils sont ..

10
Ilya

Vous pouvez également utiliser pyrex , qui peut agir en tant que colle entre haut niveau Python et code C de faible niveau. lxml est écrit dans Pyrex, par exemple.

8
Torsten Marek

Je vais être contrarian et suggérez que, si vous le pouvez, vous devriez écrire votre bibliothèque d'extension à l'aide de standard Python API . C'est vraiment bien intégré de la perspective de C et Python ... Si vous avez une expérience avec l'API Perl, vous le trouverez un très Pleasant surprise.

Cype est bien aussi, mais comme d'autres l'ont dit, cela ne fait pas C++.

Quelle est la taille de la bibliothèque que vous essayez d'envelopper? À quelle vitesse le codebase change-t-il? Toute autre question de maintenance? Celles-ci affecteront probablement le choix de la meilleure façon d'écrire les liaisons Python.

7
Dan Lenski

cype est génial, mais ne gère pas les classes C++. J'ai aussi trouvé que CTTPES est d'environ 10% plus lentement que la liaison de C directive C, mais qui dépendra fortement de ce que vous appelez.

Si vous allez aller avec CTTYPES, consultez définitivement les projets PYGLET et PYOPENGL, qui présentent des exemples massives de liaisons CTTYPE.

6
Peter Shinners

Je voulais juste ajouter quelques considérations de plus que je n'ai pas vu mentionnées encore. [EDIT: Ooops, je n'ai pas vu la réponse de Mike Steder]

Si vous souhaitez essayer d'utiliser une implémentation non CPPHON (comme Pypy, IronPython ou Jython), CLTPES est sur le seul moyen d'aller. Pypy ne permet pas d'écrire des extensions C, de sorte que Pyrex/Cython et Boost.python. Pour la même raison, CTTPES est le seul mécanisme qui fonctionnera pour IronPython et (éventuellement, une fois qu'ils travaillent tous de travail) Jython.

Comme quelqu'un l'a mentionné, aucune compilation n'est requise. Cela signifie que si une nouvelle version du .dll ou .so sort, vous pouvez simplement le déposer et charger cette nouvelle version. Tant que l'aucune des interfaces n'a changé, il s'agit d'une chute de remplacement.

5
Sean Toner

Quelque chose à garder à l'esprit est que Swig ne cible que la mise en œuvre de CPPHON. Étant donné que CTTPES est également soutenu par les implémentations PYPY et IRINPYTHON, il peut être utile d'écrire vos modules avec CTTYPES pour la compatibilité avec le plus large Python Ecosystème.

3
stderr

J'ai trouvé que Swig soit un peu gonflé dans son approche (en général, pas seulement python) et difficile à mettre en œuvre sans avoir à traverser le point de rédaction douloureux Python code avec une mentalité explicite à Soyez swig convivial, plutôt que d'écrire bien écrit Python code. Il est, IMHO, un processus bien plus simple d'écrire c Reliures C pour écrire C à n'importe quelle couche C.

Si la bibliothèque vous êtes interface pour avoir une interface C dans le cadre de la bibliothèque, un autre avantage de CTTYPES est que vous ne devez pas compiler une bibliothèque de liaison à Python distincte pour accéder aux bibliothèques tiers. Ceci est particulièrement agréable dans la formulation d'une solution pure-python qui évite les problèmes de compilation inter-plate-forme (pour ces tiers libres proposés sur des plates-formes disparates). Avoir à intégrer du code compilé dans un emballage que vous souhaitez déployer sur quelque chose comme PYPI de manière cross-plate-forme est une douleur; L'un de mes points les plus irritants sur Python Les packages utilisant Swig ou sous-jacent de Code C Explicity C sont leur plate-forme intermédiaire générale d'inavailabilité. Alors, considérez ceci si vous travaillez avec des bibliothèques tiers disponibles et en développement. A python solution autour d'eux.

En tant que réel exemple du monde, envisagez Pygtk. Ceci (je pense) utilise Swig pour générer un code C pour interfacer les appels GTK C. J'ai utilisé cela pour le moment le plus brefuement pour trouver une réelle douleur à configurer et à utiliser, avec des erreurs bizarres d'orthographe si vous n'avez pas fait les choses dans le bon ordre sur la configuration et juste en général. Ce fut une vaste expérience frustrante et lorsque j'ai examiné les définitions d'interactivité fournies par GTK sur le Web, j'ai réalisé quelle exercice simple qu'il serait d'écrire un traducteur de cette interface to python CTTYPES Interface . Un projet appelé Pyggi est né et je suis en une journée en mesure de réécrire Pygtk pour être un produit beaucoup plus longuement et un produit utile qui correspond proprement aux interfaces GTK C-objet orientées objet. Et il ne nécessitait aucune compilation de la fabrication de code C Il convient parfaitement à la plate-forme. (J'étais en fait après l'interface sur webkitgtk, qui n'est pas si multiplate-forme). Je peux aussi facilement déployer Pyggi vers n'importe quelle plate-forme supportant GTK.

0
nak