Profile de code avec le module profile et pstats

Contenu du snippet

Python est fourni avec un module qui permet de mesurer le temps passé dans chaques méthodes ou fonctions : le module Profile

Exemple d'utilisation :

La façon la plus simple d'utiliser 'Profile' est d'utiliser la fonction 'Run' de ce module (elle instancie et utilise l'objet Profile en interne), cette fonction accepte deux paramètres. Le premier indique la fonction à tracer, et le deuxième est le nom du fichier dans lequel on veut sauvegarder les résultats (il est facultatif).

Si le deuxième paramètre n'est pas renseigné :

import profile
profile.run('mafonction()')
les résultats sont renvoyés par la fonction sous la forme :

ncalls tottime percall cumtime percall filename:lineno(function)
Sinon s'il est renseigné alors les résultats seront sauvegardés dans un fichier portant le nom du fichier qui est passé en paramètre.

import profile
profile.run('mafonction()','perfMaFonction')
Le module pstats permet d'exploiter les résultats d'un fichier écrit par le module 'profile'. Pour traiter un fichier Profile, on utilise la fonction 'stat' en lui passant en paramètre le nom du fichier. Puis on affiche les résultats grâce à la fonction 'print_stats'

import pstats
p = pstats.Stats('perfMaFonction')
p.print_stats(10) // Affiche que les 10 premier résultats

Exemples :

Wed Sep 29 14:15:28 2004 perfMaFonction

53 function calls in 0.003 CPU seconds

Random listing order was used

ncalls tottime percall cumtime percall filename:lineno(function)
0 0.000 0.000 profile:0(profiler)
1 0.000 0.000 0.002 0.002 C:\TestPython\test_profile.py:29(testfunc)
8 0.000 0.000 0.002 0.000 C:\TestPython\test_profile.py:64(helper2)
4 0.000 0.000 0.000 0.000 C:\TestPython\test_profile.py:56(helper1)
1 0.001 0.001 0.003 0.003 profile:0(testfunc())
28 0.000 0.000 0.000 0.000 C:\TestPython\test_profile.py:86(__getattr__)
2 0.000 0.000 0.002 0.001 C:\TestPython\test_profile.py:38(helper)
1 0.000 0.000 0.002 0.002 :1(?)
8 0.001 0.000 0.001 0.000 C:\TestPython\test_profile.py:74(subhelper)

ncalls : nombre d'appel de la fonction de base
tottime : temps total de la fonction de base (hors sous-fonction)
percall : tottime / ncalls
cumtime : temps total du début de l'appel de la fonction de base jusqu'a la fin (sous-fonction comprise)

On peut également choisir de trier les résultats avec la procédure 'Sort_Stats' en lui indiquant en paramètre les colonnes à trier :

p.sort_stats('time') // On trie sur le temps passé

p.sort_stats('time', 'name') // On trie sur le temps passé et sur le nom

Pour des raisons de présentation, il est possible d'utiliser strip_dirs() avant d'afficher les résultats. Il permet de supprimer les chemins devant le nom du source de la fonction dans la colonne 'filename'.

import pstats
p = pstats.Stats('perfMaFonction')
p.strip_dirs()
p.print_stats()

La procedure strip_dirs() affiche les lignes de résultat aléatoirement, s'il y a eu avant un trie ('sort_stats') sur le nom alors l'ordre de trie n'est plus le même, Il faut donc utiliser 'strip_dirs' avant de faire 'sort_stats'.

La fonction 'print_callees' permet de lister toutes les fonctions appelées par la fonction indiqué en paramètre :

import pstats
stat = pstats.Stats('FichierProfile')
stat.print_callees('MaFonction()')
stat.print_callees()

sinon elle liste toutes les fonctions appelées par la fonction de base :

import pstats
stat = pstats.Stats('FichierProfile')

A voir également

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.