47 votes

Python Performance - avez-vous déjà eu à réécrire dans quelque chose d'autre?

Quelqu'un a déjà eu le code en Python, qui s'est avéré ne pas effectuer assez rapidement?

Je veux dire, vous avez été forcé de choisir une autre langue à cause de cela?

Nous étudions à l'aide de Python pour un couple de grands projets, et mon sentiment est que, dans la plupart des cas, le Python est beaucoup assez rapide pour la plupart des scénarios (par rapport à-dire, Java), parce qu'il s'appuie sur l'optimisation des routines C.

Je voulais voir si les gens avaient des instances où ils ont commencé en Python, mais fini par avoir à aller avec quelque chose d'autre en raison de la performance.

Merci.

34voto

Oui, je l'ai. J'ai écrit une ligne-nombre de programme pour un binaire (longueur de préfixe plutôt que par des tabulations) bcp de fichier de sortie une fois et fini par avoir à le refaire en C parce que le python était trop lent. Ce programme était assez petite (il n'a fallu que quelques jours pour ré-écrire en C), donc je n'ai pas pris la peine d'essayer de construire une application hybride (python colle avec de la centrale des routines écrites en C), mais cela aurait été une solution viable.

Une application plus large de la performance bits critiques peuvent être écrites dans une combinaison de C et un langage de plus haut niveau. Vous pouvez écrire le rendement-pièces critiques en C avec une interface Python pour le reste du système. SWIG, Pyrex ou Boost.Python (si vous êtes à l'aide de C++) fournissent de bons mécanismes pour faire la plomberie de votre Python interface. L' API C pour python est plus complexe que pour les Tcl ou Lua, mais n'est pas impossible de construire à la main. Pour un exemple d'un fabriqué à la main, Python/C de l'API, consultez cx_Oracle.

Cette approche a été utilisée sur un certain nombre de demandes acceptées en remontant aussi loin que les années 1970 (que je connais). Mozilla a été sensiblement écrit en Javascript autour d'un noyau moteur écrit en C. Plusieurs progiciels CAO, Interleaf (un document technique système de publication) et bien sûr EMACS sont essentiellement écrit en LISP avec une centrale C, langage d'assemblage ou autres. Tout à fait quelques commerciales et open source applications (par exemple, Chandler ou Sungard Avant Arène) utiliser Python intégré interprètes et de mettre en œuvre d'importantes parties de l'application en Python.

EDIT: En réponse à des Maîtres hollandais du commentaire, de garder une personne avec le C ou le C++ programmation des compétences de l'équipe pour un projet de Python vous donne la possibilité de l'écriture de quelques de la demande pour la vitesse. Les zones où vous pouvez vous attendre à obtenir un gain de performance significatif, où l'application n'a quelque chose de hautement itératif sur une grande structure de données ou de gros volume de données. Dans le cas de la ligne-contre-dessus, il a dû inhaler une série de fichiers totalisant plusieurs gigaoctets et de passer par un processus où il lire une variation de la longueur de préfixe et utilisé que pour déterminer la longueur du champ de données. La plupart des champs ont été court (quelques octets). C'était un peu de bit-twiddly et de très faible niveau et itératif, ce qui en fait un choix naturel pour la C.

Beaucoup de bibliothèques python comme numpy, cElementTree ou cStringIO utiliser de manière optimale la C core avec une API python qui facilite le travail avec des données agrégées. Par exemple, numpy a la matrice des structures de données et les opérations écrit en C qui font tout le travail acharné et d'une API Python qui fournit des services au niveau agrégé.

19voto

Triptych Points 70247

C'est beaucoup plus difficile de répondre à cette question que les gens sont prêts à admettre.

Par exemple, il se peut que je suis capable d'écrire un programme qui effectue mieux en Python qu'en C. Le fallacieux conclusion de cette déclaration est "Python est donc plus rapide que C". En réalité, il est peut-être parce que j'ai beaucoup plus d'expérience récente de Python et de ses meilleures pratiques et les bibliothèques standard.

En fait, personne ne peut vraiment répondre à votre question, sauf s'ils sont certains qu'ils peuvent créer une solution optimale dans les deux langues, ce qui est peu probable. En d'autres termes, "Mon C solution a été plus rapide que mon Python solution" n'est pas la même chose que "C est plus rapide que Python"

Je suis prêt à parier que Guido Van Rossum pourrait ont écrit en Python solutions pour adam et Dustin problèmes qui ont effectué assez bien.

Ma règle d'or est que si vous écrivez le genre d'application qui vous demande de compter les cycles d'horloge, vous pouvez probablement obtenir des performances acceptables en Python.

15voto

sstock Points 1289

L'ajout de mon 0,02 $pour l'enregistrement.

Mon travail consiste à développer des modèles numériques qui fonctionnent sur 100 de giga-octets de données. Les problèmes difficiles sont à venir avec un chiffre d'affaires de génération de solution rapidement (c'est à dire le temps-à-marché). Pour être un succès commercial, la solution dispose également d' exécuter rapidement (calculer la solution dans un minimum de temps).

Pour nous, Python s'est avéré être un excellent choix pour développer des solutions pour les raisons fréquemment citées: le développement rapide du temps, la langue de l'expressivité, de riches bibliothèques, etc. Mais pour répondre à la vitesse d'exécution des besoins, nous avons adopté la 'Hybride' approche que plusieurs réponses ont déjà mentionné.

  1. Utilisation de numpy pour le calcul intense pièces. Nous obtenons à 1,1 x 2,5 x la vitesse d'un "native" de C++ solution avec numpy avec moins de code, moins de bugs, et de la réduction du temps de développement.
  2. Le décapage (Python sérialisation d'un objet) résultats intermédiaires à minimiser les risques de ré-calcul. La nature de notre système nécessite plusieurs étapes sur les mêmes données, nous avons donc 'mémoriser' les résultats et de les ré-utiliser dans la mesure du possible.
  3. Le profilage et le choix de meilleurs algorithmes. Il a été dit dans d'autres réponses, mais je vais le répéter: nous whip-out cProfile et essayer de le remplacer hot-spots avec un meilleur algorithme. Pas applicable dans tous les cas.
  4. Allez C++. Si le ci-dessus échoue, alors nous appelons une bibliothèque C++. Nous utilisons PyBindGen à écrire notre Python/C++ wrappers. Nous l'avons trouvé de loin supérieure à SWIG, SIP, et coup de pouce.Python comme il produit direct Python API C code sans couche intermédiaire.

La lecture de cette liste, vous pourriez penser que "Ce que beaucoup de travail! Je vais le faire dans les [C/C++/Java/assembleur] la première fois autour et être fait avec elle."

Permettez-moi de le mettre en perspective. À l'aide de Python, nous avons été en mesure de produire un travail de génération de recettes de l'application dans les 5 semaines qui, dans d'autres langues, avait auparavant requis 3 mois pour les projets de portée similaire. Ce temps comprend le temps nécessaire pour optimiser le Python pièces que nous avons trouvé pour être lent.

7voto

xan Points 5035

Tout en uni nous étions en train d'écrire un système de vision pour l'analyse du comportement humain basé sur les clips vidéo. Nous avons utilisé python en raison de l'excellente PIL, pour accélérer le développement et laissez-nous obtenir un accès facile à l'image des cadres, nous aurions extraites de la vidéo pour la conversion à des tableaux etc.

Pour 90% de ce que nous voulions, c'était très bien, et puisque les images ont été raisonnablement faible résolution, la vitesse n'était pas mauvais. Cependant, quelques-uns des processus nécessaires certains complexes pixel-par-pixel de calculs ainsi que de circonvolutions qui sont notoirement lent. Pour ces domaines nous avons ré-écrit les parties intimes des boucles en C et viens de mettre à jour les anciennes fonctions Python pour appeler les fonctions C.

Cela nous a donné le meilleur des deux mondes. Nous avons eu de la facilité d'accès aux données que python offre, ce qui a permis de développer de rapide, et le linéaire de la vitesse de C pour la plupart des calculs intensifs.

7voto

Kamil Kisiel Points 7298

Pas si loin. Je travaille pour une entreprise qui dispose d'un moteur de simulation moléculaire et un tas de programmes écrits en python pour le traitement de la grande de plusieurs giga-octets de bases de données. Tous nos logiciels d'analyse est maintenant écrit en Python, en raison de l'énorme avantage dans le développement de la flexibilité et du temps.

Si quelque chose n'est pas assez rapide, nous profil avec cProfile et de trouver les goulots d'étranglement. Habituellement, il y a une ou deux fonctions qui prennent jusqu'à 80 ou 90% du temps d'exécution. Nous prenons ensuite de ces fonctions et de les réécrire en C, quelque chose qui Python fait mort facile et C de l'API. Dans de nombreux cas, cela se traduit dans un ordre de grandeur ou plus rapide. Problème disparu. Nous avons ensuite aller sur notre petit bonhomme de chemin en continuant à écrire tout le reste en Python. Rincer et répéter...

Pour l'ensemble des modules ou des classes, nous avons tendance à utiliser Boost.python, il peut être un peu d'un ours, mais en fin de compte fonctionne bien. Si c'est juste une fonction ou deux, nous avons parfois inline avec scipy.armure si le projet est déjà à l'aide de scipy.

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