====== Tuning Python ====== En tant que langage interprété, Python est la plupart du temps légèrement moins performant que des langages tels que le C. Cependant, sur des traitements non-chargeants pour la machine concernée (c'est-à-dire des traitements qui entrainent une charge loin des limites de la machine, et donc négligeables), ce défaut de performance est invisible. Sur des traitements chargeants, l'implémentation va être importante, en utilisant des patterns de programmation adéquats, on va pouvoir se rapprocher des performances du C. Il existe même des modules permettant d'inclure du code C directement au sein du code Python, ce qui va faire tendre les performances vers celles du code C (avec un overhead se comptant en microseconde par rapport à du code C compilé). Dans tous les cas, le processus d'optimisation des performances se déroule comme suit: - Avoir du code opérationnel ("de production"). ("Early tuning is the source of all evil.") - S'assurer que son temps d'exécution ou sa charge mémoire sont critiques. (Pas besoin d'optimiser un traitement peu utilisé ou déjà efficace) - Profiler le code pour trouver les goulots d'étranglement. - Optimiser le code concerné. - S'assurer de la non-regression. ===== Performance python (en général) ===== * [[http://wiki.python.org/moin/PythonSpeed/PerformanceTips|Une bonne entrée en matière]] * [[http://www.developpez.net/forums/d600928/autres-langages/python-zope/general-python/performances-python/|Discussion sur developpez.com]] * [[http://wiki.python.org/moin/PythonSpeed|Python Speed]] * [[http://scipy.org/PerformancePython|Performance]] (vue par Scipy) ===== Profilage ===== * [[http://pypi.python.org/pypi/guppy/0.1.9|guppy, un module de profilage de la mémoire (heap)]] * [[http://effbot.org/pyfaq/why-doesnt-python-release-the-memory-when-i-delete-a-large-object.htm|Détails sur l'allocation de la mémoire par l'interpréteur Python]] * [[http://docs.python.org/library/timeit.html|Timeit, module de profilage basique de temps d'exécution]] * [[http://docs.python.org/library/profile.html|Profile, le module de référence pour le profilage en Python]] (on pourra utiliser cProfile pour un overhead encore inférieur) * [[http://docs.python.org/library/debug.html|Debug sur docs.python.org]] ===== Techniques d'optimisation ===== * [[http://www.gabes.fr/jean/2010/02/15/partie-a-trois-python-__slots__-et-metaclass/|Slots & metaclasses]] (à rapprocher de l'article dans un HS LinuxMag sur Python) * [[http://stackoverflow.com/questions/1120927/which-is-better-in-python-del-or-delattr|Discussions sur StackOverFlow sur l'efficacité de del par rapport à delattr]] (NB: le module ''dis'' permet de "désassembler" du code interprété Python en donc d'avoir un aperçu de la charge CPU conséquente) * [[http://www.scipy.org/Weave|Weave, un module de Scipy permettant d'inclure du C/C++ dans du code Python]]