2010-09-01 16 views
3

Je prévois d'utiliser Python pour développer une application web. Quelqu'un a une idée sur un accélérateur pour python? (quelque chose comme eAccelerator ou apc pour php) sinon, est-il possible de mettre en cache le bytecode python pré-compilé? Toute idée sur la comparaison des performances entre python et php (en supposant que les latences db/réseau sont les mêmes)Accélérateur Python

Merci d'avance.

Répondre

3

D'autres ont mentionné des fichiers de code octet Python, mais cela est en grande partie hors de propos. En effet, les mécanismes d'hébergement pour Python, à l'exception de CGI, maintiennent l'application web Python en mémoire entre les requêtes. Ceci est différent de PHP qui jette efficacement l'application entre les requêtes. En tant que tel, Python n'a pas besoin d'un accélérateur comme le fonctionnement des mécanismes d'hébergement Web Python évite les problèmes que PHP a.

2

Le bytecode python compilé est automatiquement mis en cache dans les fichiers .pyc dans tous les environnements que j'ai vus. Il y a tellement besoin de faire autre chose pour autant que je sache.

Si vous voulez générer ces fichiers, vous pouvez utiliser directement: http://docs.python.org/library/py_compile.html

5

Tant que vous faites des quantités infimes de travail dans votre « script principal » (celui que vous appeler directement avec python et qui obtient un __name__ de __main__) vous n'avez pas à vous soucier de "mettre en cache le bytecode python précompilé": lorsque vous import foo, foo.py est enregistré sur le disque (même répertoire) que foo.pyc, tant que ce répertoire est accessible en écriture, la compilation déjà bytecode arrive une fois et "pour toujours" Python chargera foo.pyc directement dans chaque nouveau processus qui d oes import foo - dans un seul processus, tous les import foo sauf le premier est juste une recherche rapide dans un dictionnaire en mémoire (le dictionnaire sys.module). Une idée de performance de base en Python: s'assure que chaque bit de code substantiel se produit dans def instructions dans les modules - n'ont pas de au niveau supérieur du module, dans le script principal, ou esp. dans exec et eval instructions/expressions! -). Je n'ai pas de benchmarks pour PHP et Python, mais j'ai remarqué que Python continue à être optimisé à chaque nouvelle version, donc assurez-vous de comparer une version récente (idéalement 2.7, au moins 2.6) si vous voulez voir "les fastes Python". Si vous ne le trouvez pas encore assez vite, cython (un dialecte Python conçu pour compiler directement en C, et donc en code machine, avec quelques limitations) est aujourd'hui le moyen le plus simple d'optimiser de manière sélective les modules dont le profilage vous indique le besoin.

8

Il y a une astuce à cela. Il s'appelle mod_wsgi.

L'essence de cela fonctionne comme ceci.

  1. Pour le contenu « statique » (.css, .js, images, etc.) les mettre dans un répertoire afin qu'ils par Apache, sans votre programme Python sachant qu'ils ont été envoyés. Pour le contenu "dynamique" (la page HTML principale elle-même), vous utilisez mod_wsgi pour lancer un processus "back-end" qui s'exécute en dehors d'Apache.

Ceci est plus rapide que PHP parce que maintenant plusieurs choses se passent à la fois. Apache a envoyé la requête à un processus dorsal, puis s'est déplacé pour gérer la requête suivante alors que le backend est toujours en train d'exécuter le premier. En outre, lorsque vous avez envoyé votre page HTML, les requêtes suivantes sont traitées par Apache sans que votre programme Python ne sache ou ne se soucie de ce qui se passe.Cela conduit à d'énormes accélérations. Rien à voir avec la vitesse de Python. Tout à faire avec l'architecture globale.

+1

Lien: http://code.google.com/p/modwsgi/ – dkamins