Rendez-vous sur https://vmprof.readthedocs.org pour plus d'informations !
pip install vmprof
python -m vmprof <your program> <your program args>
Notre système de build fournit des roues à PyPI (Linux, Mac OS X). Si vous construisez à partir des sources, vous devez installer les en-têtes de développement CPython et les en-têtes libunwind (sous Linux uniquement). Sous Windows, cela signifie que vous avez besoin du compilateur Microsoft Visual C++ pour votre version Python.
La configuration du développement peut être effectuée à l'aide des commandes suivantes :
$ virtualenv -p /usr/bin/python3 vmprof3
$ source vmprof3/bin/activate
$ python setup.py develop
Vous devez installer les packages de développement Python. Dans le cas par exemple de Debian ou Ubuntu, le package dont vous avez besoin est python3-dev
et libunwind-dev
. Il est maintenant temps d'écrire un test et d'implémenter votre fonctionnalité. Si vous souhaitez que vos modifications affectent vmprof.com, rendez-vous sur https://github.com/vmprof/vmprof-server et suivez les instructions de configuration.
Consultez notre section de développement sur https://vmprof.readthedocs.org pour plus d'informations.
vmprofshow
est un outil de ligne de commande fourni avec VMPrf . Il peut lire les fichiers de profil et produire une sortie formatée.
Voici un exemple d'utilisation vmprofshow
:
Exécutez ce petit programme qui brûle les cycles du processeur (avec vmprof activé) :
$ pypy vmprof/test/cpuburn.py # you can find cpuburn.py in the vmprof-python repo
Cela produira un fichier de profil vmprof_cpuburn.dat
. Affichez maintenant le profil en utilisant vmprofshow
. vmprofshow
propose plusieurs modes d'affichage des données. Nous allons commencer par le mode arborescent.
$ vmprofshow vmprof_cpuburn.dat tree
Vous verrez une sortie (colorée) :
$ vmprofshow vmprof_cpuburn.dat tree
100.0% <module> 100.0% tests/cpuburn.py:1
100.0% .. test 100.0% tests/cpuburn.py:35
100.0% .... burn 100.0% tests/cpuburn.py:26
99.2% ...... _iterate 99.2% tests/cpuburn.py:19
97.7% ........ _iterate 98.5% tests/cpuburn.py:19
22.9% .......... _next_rand 23.5% tests/cpuburn.py:14
22.9% ............ JIT code 100.0% 0x7fa7dba57a10
74.7% .......... JIT code 76.4% 0x7fa7dba57a10
0.1% .......... JIT code 0.1% 0x7fa7dba583b0
0.5% ........ _next_rand 0.5% tests/cpuburn.py:14
0.0% ........ JIT code 0.0% 0x7fa7dba583b0
Il existe également une option --html
pour émettre les mêmes informations que HTML à afficher dans un navigateur. Dans ce cas, les branches de l'arbre peuvent être développées et réduites de manière interactive.
vmprof prend en charge le mode de profilage de ligne, qui permet de collecter et d'afficher les statistiques de lignes distinctes à l'intérieur des fonctions.
Pour activer la collecte des statistiques de lignes, ajoutez l'argument --lines
à vmprof :
$ python -m vmprof --lines -o < output-file > < your program > < your program args >
Ou transmettez l'argument lines=True
à la fonction vmprof.enable
, lors de l'appel de vmprof à partir du code.
Pour voir les statistiques de ligne pour toutes les fonctions, utilisez le mode lines
de vmprofshow
:
$ vmprofshow < output-file > lines
Pour voir les statistiques de ligne pour une fonction spécifique, utilisez l'argument --filter
avec le nom de la fonction :
$ vmprofshow < output-file > lines --filter < function-name >
Vous verrez le résultat :
$ vmprofshow vmprof_cpuburn.dat lines --filter _next_rand
Total hits: 1170 s
File: tests/cpuburn.py
Function: _next_rand at line 14
Line # Hits % Hits Line Contents
=======================================
14 38 3.2 def _next_rand(self):
15 # http://rosettacode.org/wiki/Linear_congruential_generator
16 835 71.4 self._rand = (1103515245 * self._rand + 12345) & 0x7fffffff
17 297 25.4 return self._rand
vmprofshow
dispose également d'un mode flat
.
Bien que les styles de sortie arborescents et basés sur les lignes pour vmprofshow
donnent une bonne vue de l'endroit où le temps est passé lorsqu'ils sont visualisés depuis la « racine » du graphique d'appel, il est parfois souhaitable d'obtenir une vue depuis les « feuilles » à la place. Ceci est particulièrement utile lorsqu'il existe des fonctions qui sont appelées à partir de plusieurs endroits, où chaque appel ne prend pas beaucoup de temps, mais où tous les appels pris ensemble représentent un coût substantiel.
$ vmprofshow vmprof_cpuburn.dat flat andreask_work@dunkel 15:24
28.895% - _PyFunction_Vectorcall:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/call.c:389
18.076% - _iterate:cpuburn.py:20
17.298% - _next_rand:cpuburn.py:15
5.863% - <native symbol 0x563a5f4eea51>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/longobject.c:3707
5.831% - PyObject_SetAttr:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/object.c:1031
4.924% - <native symbol 0x563a5f43fc01>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:787
4.762% - PyObject_GetAttr:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/object.c:931
4.373% - <native symbol 0x563a5f457eb1>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:1071
3.758% - PyNumber_Add:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:957
3.110% - <native symbol 0x563a5f47c291>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/longobject.c:4848
1.587% - PyNumber_Multiply:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:988
1.166% - _PyObject_GetMethod:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/object.c:1139
0.356% - <native symbol 0x563a5f4ed8f1>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/longobject.c:3432
0.000% - <native symbol 0x7f0dce8cca80>:-:0
0.000% - test:cpuburn.py:36
0.000% - burn:cpuburn.py:27
Parfois, il peut être souhaitable d'exclure les fonctions « natives » :
$ vmprofshow vmprof_cpuburn.dat flat --no-native andreask_work@dunkel 15:27
53.191% - _next_rand:cpuburn.py:15
46.809% - _iterate:cpuburn.py:20
0.000% - test:cpuburn.py:36
0.000% - burn:cpuburn.py:27
Notez que la sortie représente le temps passé dans chaque fonction, à l'exclusion des fonctions appelées. (En mode --no-native
, les appelés en code natif restent inclus dans le total.)
Parfois, il peut également être souhaitable d'obtenir des timings incluant les fonctions appelées :
$ vmprofshow vmprof_cpuburn.dat flat --include-callees andreask_work@dunkel 15:31
100.000% - <native symbol 0x7f0dce8cca80>:-:0
100.000% - test:cpuburn.py:36
100.000% - burn:cpuburn.py:27
100.000% - _iterate:cpuburn.py:20
53.191% - _next_rand:cpuburn.py:15
28.895% - _PyFunction_Vectorcall:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/call.c:389
7.807% - PyNumber_Multiply:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:988
7.483% - <native symbol 0x563a5f457eb1>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:1071
6.220% - <native symbol 0x563a5f4eea51>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/longobject.c:3707
5.831% - PyObject_SetAttr:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/object.c:1031
4.924% - <native symbol 0x563a5f43fc01>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:787
4.762% - PyObject_GetAttr:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/object.c:931
3.758% - PyNumber_Add:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/abstract.c:957
3.110% - <native symbol 0x563a5f47c291>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/longobject.c:4848
1.166% - _PyObject_GetMethod:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/object.c:1139
0.356% - <native symbol 0x563a5f4ed8f1>:/home/conda/feedstock_root/build_artifacts/python-split_1608956461873/work/Objects/longobject.c:3432
Cette vue est assez similaire à la vue "arborescence", moins l'imbrication.