61 votes

Python: SWIG vs ctypes

En python, dans quelles circonstances est RASADE un meilleur choix que ctypes pour l'appel de points d'entrée dans les bibliothèques partagées? Supposons que vous n'avez pas le RASADE fichier d'interface(s).

Quelles sont les mesures de la performance des deux?

96voto

MajesticRa Points 2244

J'ai une riche expérience de l'utilisation de swig. SWIG prétend que c'est la solution rapide pour envelopper les choses. Mais dans la vraie vie...


Inconvénients:

SWIG est développé pour être général, pour tout le monde et pour plus de 20 langues. En général, il conduit à des inconvénients:
- les besoins de configuration (RASADE .j'modèles), il est parfois difficile,
- l'absence de traitement de certains cas particuliers (voir python propriétés supplémentaires),
- manque de performance, pour certaines langues.

Python contre:

1) Code de style inconsistancy. C++ et python sont très différentes des styles de code (c'est évident, certes), les possibilités de rasade de rendre le code cible plus pythonish est très limitée. À titre d'exemple, il est cul-cœur à créer des propriétés de getters et setters. Voir ce q&a

2) l' Absence d'une large communauté. Swig avoir de la bonne documentation. Mais si l'on a pris quelque chose qui n'est pas dans la documentation, il n'y a pas d'information du tout. Pas de blogs, ni googler aide. Donc, on se creuser fortement RASADE code généré dans ce cas... ce Qui est terrible, je pourrais dire...

Procs:

  • Dans les cas simples, il est vraiment rapide, facile et simple

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

  • Une grande préoccupation au sujet de SWIG est une performance. Depuis la version 2.04 RASADE comprend '-builtin " drapeau qui en fait RASADE même plus rapide que les autres méthodes automatisées d'emballage. Au moins quelques repères le montre.


Quand UTILISER GORGÉE?

J'en ai donc conclu que pour moi les deux cas, lorsque le swig est bon d'utiliser:

2) Si on a besoin d'envelopper le code C++ pour plusieurs langues. Ou si éventuellement il pourrait y avoir un moment où l'on doit distribuer le code pour plusieurs langues. À l'aide de SWIG est fiable dans ce cas.

1) Si l'on doit rapidement envelopper plusieurs fonctions de certains de la bibliothèque C++ pour la fin de l'utilisation.


Vivre l'expérience

Mise à jour :
Il est d'un an et demi passé comme nous l'avons fait une conversion de notre bibliothèque à l'aide de SWIG.

Nous avons d'abord fait une version de python.Il y a eu plusieurs moments où nous avons connu des problèmes avec SWIG - c'est vrai. Mais pour l'instant, nous avons élargi notre bibliothèque de Java et de .NET. Nous avons donc 3 langues avec 1 RASADE. Et je pourrais dire que RASADE de roches en termes de gain de BEAUCOUP de temps.

Mise à jour 2:
Cela fait deux ans que nous utilisons GORGÉE de cette bibliothèque. SWIG est intégré dans notre système de construction. Récemment, nous avons eu de grandes API changement de la bibliothèque C++. SWIG a parfaitement fonctionné. La seule chose dont nous avions besoin pour faire est d'ajouter plusieurs %le renommer .j'ai des fichiers afin que nos CppCamelStyleFunctions() maintenant looks_more_pythonish en python. D'abord j'étais inquiet au sujet de certains problèmes qui pourraient survenir, mais rien ne s'est mal passé. C'était incroyable. Juste quelques modifications et tout répartis en 3 langues. Maintenant, je suis convaincu que c'est une bonne solution pour utiliser RASADE dans notre cas.

Mise à jour 3:
Il est à 3 ans que nous utilisons RASADE de notre bibliothèque. Changement majeur: la partie python a été totalement réécrit en pur python. La raison en est que python est utilisé pour la majorité des applications de notre bibliothèque. Même si elle est pure version de python fonctionne plus lent que C++ emballage, il est plus commode de travailler avec des pur python, ne pas se battre avec des bibliothèques natives.

SWIG est encore utilisé pour .NET et versions de Java.

La question Principale ici "devrions-nous utiliser SWIG pour python, si nous avons commencé le projet depuis le début?". Nous! SWIG nous a permis de rapidement la distribution de nos produits à de nombreuses langues. Il a travaillé pour une période de temps qui nous a donné l'occasion de mieux comprendre nos exigences des utilisateurs.

70voto

Thomas Wouters Points 38811

SWIG génère (assez moche) code C ou C++. Elle est simple à utiliser pour les fonctions simples (des choses qui peuvent être traduits directement) et raisonnablement facile à utiliser pour des fonctions plus complexes (telles que les fonctions avec des paramètres de sortie qui ont besoin d'une traduction supplémentaire de l'étape de représenter en Python.) Pour les plus puissants d'interfaçage, vous avez souvent besoin d'écrire des bits de C dans le cadre de l'interface de fichier. Pour rien, mais simple d'utilisation, vous devez savoir à propos de Disponible et la façon dont il représente les objets -- pas dur, mais quelque chose à garder à l'esprit.

ctypes vous permet d'accéder directement à des fonctions C, les structures de données, et les autres, et de la charge arbitraire des bibliothèques partagées. Vous n'avez pas besoin d'écrire de C pour ce faire, mais vous avez besoin de comprendre comment fonctionne. C'est, on pourrait dire, le revers de la médaille de SWIG: il ne génère pas de code, et il n'a pas besoin d'un compilateur à l'exécution, mais pour quelque chose, mais simple d'utilisation, il ne nécessite que vous comprenez la façon dont les choses comme C les types de données, le casting, la gestion de la mémoire et de l'alignement de travail. Vous devez également manuellement ou automatiquement traduire C les structures, les syndicats et les tableaux en l'équivalent ctypes discbased, y compris le droit de disposition de la mémoire.

Il est probable que, dans la pure exécution, SWIG est plus rapide que ctypes -- parce que la gestion du travail est fait en C compile-time plutôt que d'en Python à l'exécution. Cependant, à moins que vous interface beaucoup de différentes fonctions C, mais seulement à quelques reprises, il est peu probable que la surcharge sera vraiment perceptible.

En temps de développement, ctypes a une beaucoup plus faible coût de démarrage: vous n'avez pas à apprendre à propos des fichiers d'interface, vous n'avez pas de générer .c fichiers et de les compiler, vous n'avez pas de vérifier et de silence avertissements. Vous pouvez simplement sauter dedans et de commencer à l'aide d'une seule fonction C avec un minimum d'effort, puis de l'étendre à plus. Et vous obtenez de tester et essayer des choses directement dans l'interpréteur Python. Habillage de beaucoup de code est un peu fastidieux, bien qu'il existe des tentatives pour rendre cela plus simple (comme ctypes-configurer.)

SWIG, d'autre part, peut être utilisé pour générer des wrappers pour plusieurs langues (interdiction de la langue des détails spécifiques qui doivent remplir, comme la coutume du code C je l'ai mentionné ci-dessus.) Lors de l'emballage des lots et des lots de code qui RASADE peut gérer avec un peu d'aide, la génération de code peut également être beaucoup plus simple à configurer que le ctypes équivalents.

13voto

David Nehme Points 11564

CTypes est très cool et beaucoup plus facile que de GORGÉE, mais il a l'inconvénient d'être mal ou malveillante-écrit le code python peut en fait crash le python processus. Vous devriez également envisager de stimuler python. À mon humble avis, c'est effectivement plus facile que de gorgée tout en vous donnant plus de contrôle sur la finale python interface. Si vous êtes à l'aide de C++, de toute façon, vous pouvez aussi ne pas ajouter d'autres langues à votre mélange.

8voto

Torsten Marek Points 27554

Vous pouvez également utiliser Pyrex, qui peut agir comme une colle entre le haut niveau du code Python et de bas-niveau C du code. lxml est écrit en Pyrex, par exemple.

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