L'extension de python - à swig, de ne pas gorgée ou Cython
J'ai trouvé le goulot d'étranglement dans mon code python, jouait avec psycho etc. Alors décidé d'écrire un c/c++ extension pour la performance.
Avec l'aide de swig vous presque n'avez pas à vous préoccuper des arguments etc. Tout fonctionne très bien.
Maintenant, ma question: swig crée un assez grand py-fichier qui fait beaucoup de "vérifications" et "PySwigObject' avant d'appeler le réel .pyd ou .donc le code.
Quelqu'un d'entre vous avez de l'expérience s'il y a certains plus de performance à gagner si vous inscrire à la main ce fichier ou laissez rasade de le faire.
Vous devez vous connecter pour publier un commentaire.
Pour sûr, vous aurez toujours un gain de performances de faire cela à la main, mais le gain sera très faible par rapport à l'effort requis pour ce faire. Je n'ai pas de chiffre à vous donner mais je ne le recommande pas, car vous aurez besoin de maintenir l'interface à la main, et ce n'est pas une option si votre module est grande!
Vous avez fait la bonne chose à choisi d'utiliser un langage de script parce que vous avez voulu un rapide développement. De cette façon, vous avez évité le début de l'optimisation du syndrome, et maintenant vous voulez optimiser le goulot d'étranglement des pièces de, la grande! Mais si vous ne le C/python interface à la main, vous allez tomber dans le début de l'optimisation du syndrome de pour assurer.
Si vous voulez quelque chose avec moins de code de l'interface, vous pouvez penser à la création d'une dll à partir de votre code en C, et l'utilisation de la bibliothèque directement à partir de python avec cstruct.
Tenir également compte de la Cython si vous souhaitez utiliser uniquement code python dans votre programme.
Vous devriez envisager de Boost.Python si vous ne prévoyez pas de générer des liaisons pour d'autres langues, avec swig.
Si vous avez beaucoup de fonctions et de classes à lier, Py++ est un grand outil qui génère automatiquement le code nécessaire pour faire les liaisons.
Pybindgen peut également être une option, mais c'est un nouveau projet et moins complète que Boost.Python.
Edit:
Peut-être que j'ai besoin d'être plus explicite sur les avantages et les inconvénients.
Rasade:
pro: vous pouvez générer des liaisons pour de nombreux langages de script.
inconvénients: je n'aime pas la façon dont l'analyseur fonctionne. Je ne sais pas si le fait quelques progrès, mais il y a deux ans l'analyseur C++ était assez limité. La plupart du temps, j'ai dû copier/coller de mon .h-têtes ajouter un peu de
%
personnages et de donner des conseils supplémentaires à la rasade de l'analyseur.J'ai également été nécessaires pour traiter avec le Python, C-API de temps en temps (pas si) compliqué conversions de type.
Je ne suis pas en utilisant plus.
Coup de pouce.Python:
pro:
C'est un très complète de la bibliothèque. Il permet de faire presque tout ce qui est possible avec le C-API, mais en C++. Je n'ai jamais eu à écrire des C-code de l'API avec cette bibliothèque. Je n'ai jamais rencontré de bug dû à la bibliothèque. Code pour les liaisons soit fonctionne comme un charme ou de refuser de compiler.
C'est probablement l'une des meilleures solutions actuellement disponibles si vous avez déjà quelques de la bibliothèque C++ pour lier. Mais si vous avez seulement une petite fonction C à réécrire, je serais probablement essayer avec Cython.
inconvénients: si vous n'avez pas de pré-compilation de Boost.Bibliothèque Python vous allez utiliser Bjam (trier de faire de remplacement). J'ai vraiment la haine de Bjam et sa syntaxe.
Les bibliothèques Python créé avec B. P ont tendance à devenir obèses. Il prend également un beaucoup de temps à compiler.
Py++ (supprimé): c'est coup de pouce.Python facile. Py++ utilise un analyseur C++ pour lire le code, et ensuite génère de Boost.Le code Python automatiquement. Vous disposez également d'un grand soutien de son auteur (non, ce n'est pas moi 😉 ).
inconvénients: seulement les problèmes en raison de coup de pouce.Python lui-même. Mise à jour: à partir de 2014, ce projet semble maintenant abandonnées.
Pybindgen:
Il génère le code de traiter avec le C-API. Vous pouvez décrire les fonctions et les classes dans un fichier Python, ou laissez Pybindgen lire vos en-têtes et de générer des liaisons automatiquement (pour cela, il utilise pygccxml, une bibliothèque python écrit par l'auteur de Py++).
inconvénients: c'est un projet jeune, avec une petite équipe de coup de pouce.Python. Il y a encore quelques limitations: vous ne pouvez pas utiliser l'héritage multiple pour vos classes C++, les Rappels (pas automatiquement, en fonction de rappel personnalisée de la manipulation de code peut être écrit, tout de même). Traduction de Python exceptions à C.
Il est certainement en valeur un regard.
Un nouveau:
Sur 2009/01/20 l'auteur de Py++ a annoncé un nouveau package pour l'interfaçage code C/C++ avec python. Il est basé sur ctypes. Je ne l'ai pas essayé déjà, mais je vais le faire! Remarque: ce projet se penche discontiued, comme Py++.
CFFI: Je ne connaissais pas l'existence de celui-ci jusqu'à très récemment, donc pour l'instant je ne peux pas donner mon avis. Il semble que vous pouvez définir des fonctions en C, en Python chaînes et de les appeler directement à partir du même module Python.
Cython: C'est la méthode que je suis en train de l'utiliser dans mes projets. Fondamentalement, vous écrivez du code dans le spécial .custode fichiers. Ces fichiers sont compilés (traduit) dans un code C qui à son tour sont compilées Disponible modules.
Cython code peut ressembler à des Python (et en fait de la pure Python sont valides .custode Cython fichiers), mais vous pouvez également plus d'informations, comme les types de variables. Cette option permet de taper Cython pour générer plus vite C code. Code en Cython fichiers peuvent appeler à la fois pur Python fonctions, mais aussi en C et C++ fonctions (et aussi des méthodes C++).
Il m'a fallu un certain temps pour réfléchir à Cython, que, dans le même appeler du code C et C++ la fonction, mélanger en Python et en C les variables, et ainsi de suite. Mais c'est un langage très puissant, avec un actif (en 2014) et de la communauté amicale.
RASADE 2.0.4 a introduit un nouveau -builtin option qui améliore les performances.
J'ai fait un peu d'analyse comparative à l'aide d'un exemple de programme qui fait beaucoup de rapide des appels à une extension C++.
J'ai construit l'extension d'utilisation de boost.python, PyBindGen, SIP et GORGÉE avec et sans l'-builtin option. Voici les résultats (moyenne de 100 pistes):
RASADE utilisé pour être la plus lente. Avec le nouveau -builtin option, GORGÉE semble être plus rapide.
Une observation: sur la Base de l'analyse comparative menée par le pybindgen les développeurs, il n'y a pas de différence significative entre les boost.python et swig. Je n'ai pas fait ma propre analyse comparative de vérifier comment une grande partie de cela dépend de la bonne utilisation de la poussée.la fonctionnalité python.
Remarque aussi qu'il y a peut être une raison qui pybindgen semble être en général un peu plus rapide que rasade et boost.python: il peut produisent pas aussi polyvalent qu'une liaison que les deux autres. Par exemple, la propagation d'exception, argument appel vérification de type, etc. Je n'ai pas eu l'occasion de les utiliser pybindgen encore, mais j'ai l'intention de.
Boost est en général assez gros paquet à installer, et le dernier que j'ai vu, vous ne pouvez pas installer boost python vous bien besoin de toute la bibliothèque Boost. Comme d'autres l'ont mentionné compilation sera lente en raison d'une utilisation de modèle de programmation, ce qui signifie aussi généralement assez mystérieux messages d'erreur au moment de la compilation.
Résumé: compte tenu de la facilité GORGÉE d'installation et d'utilisation, qu'il génère décent liaison qui est robuste et polyvalent, et que l'un fichier d'interface permet à votre DLL C++ est disponible à partir de plusieurs autres langues comme le LUA, C# et Java, je serais favorable sur coup de pouce.python. Mais à moins que vous vraiment besoin de support multi-langue, je voudrais jeter un oeil de près PyBindGen en raison de sa prétendue vitesse, et de prêter attention à la robustesse et la polyvalence de la liaison qu'il génère.
Depuis que vous êtes préoccupé par la vitesse et les frais généraux, je vous suggère de considérer PyBindGen .
J'ai de l'expérience de l'utiliser pour envelopper une grande internes de la bibliothèque C++. Après avoir essayé GORGÉE, SIP, et coup de pouce.Python je préfère PyBindGen pour les raisons suivantes:
Y avoir des dragons ici. Ne pas gorgée, ne pousseront pas. Pour tout projet complexe le code que vous devez remplir vous-même pour leur faire le travail devient rapidement ingérable. Si c'est une plaine de l'API C de votre bibliothèque (pas de cours), vous pouvez simplement utiliser ctypes. Il sera facile et indolore, et vous n'aurez pas à passer des heures de chalutage par le biais de la documentation pour ces labyrinthique wrapper projets pour essayer de trouver le minuscule remarque à propos de la fonctionnalité dont vous avez besoin.
Si ce n'est pas une grande extension, boost::python pourrait également être une option, il s'exécute plus rapidement que rasade, parce que vous contrôlez ce qui se passe, mais ça va prendre plus de temps de dev.
De toute façon rasade de surcharge est acceptable si la quantité de travail à l'intérieur d'un seul appel est assez grand. Par exemple, si vous avez problème, c'est que vous avez moyennes logique de bloc que vous souhaitez déplacer vers C/C++, mais ce bloc est appelé dans un virage serré en boucle, souvent, vous pourriez avoir à éviter de swig, mais je ne peux pas vraiment penser à des exemples du monde réel, sauf pour le script graphiques shaders.
Avant de donner votre code python, jetez un oeil à ShedSkin. Ils réclament de meilleures performances que Psyco sur un code (et aussi de l'état qu'il est encore au stade expérimental).
D'autre, il y a plusieurs choix pour la liaison C/C++ code python.
Boost est long à compiler, mais c'est vraiment le plus flexible et facile à utiliser la solution.
Je n'ai jamais utilisé GORGÉE, mais par rapport à boost, c'est pas aussi souple que le générique de liaison, pas un framework dédié à python.
Choix suivant est Pyrex. Il permet d'écrire en pseudo code python qui sera compilé comme C extension.
Il y a un article intéressant de lire sur le sujet Cython, pybind11, cffi – quel outil choisir?
Récapitulatif rapide pour les plus pressés:
Cython compile votre python, C/C++ vous permettant d'intégrer votre C/C++ dans le code python. Utilise statique de la liaison. Pour python pour les programmeurs.
pybind11 (et coup de pouce.python) est à l'opposé. Lier vos trucs au moment de la compilation du C++ côté. Pour les programmeurs en C++.
CFFI vous permet de lier le natif de trucs dynamiquement à l'exécution. Simple à utiliser, mais une augmentation des performances.