¡Dirígete a https://vmprof.readthedocs.org para obtener más información!
pip install vmprof
python -m vmprof <your program> <your program args>
Nuestro sistema de compilación envía ruedas a PyPI (Linux, Mac OS X). Si construye desde el código fuente, necesita instalar los encabezados de desarrollo CPython y los encabezados libunwind (solo en Linux). En Windows, esto significa que necesita el compilador Microsoft Visual C++ para su versión de Python.
La configuración del desarrollo se puede realizar utilizando los siguientes comandos:
$ virtualenv -p /usr/bin/python3 vmprof3
$ source vmprof3/bin/activate
$ python setup.py develop
Necesita instalar paquetes de desarrollo de Python. En el caso de, por ejemplo, Debian o Ubuntu, el paquete que necesita es python3-dev
y libunwind-dev
. Ahora es el momento de escribir una prueba e implementar su función. Si desea que sus cambios afecten a vmprof.com, diríjase a https://github.com/vmprof/vmprof-server y siga las instrucciones de configuración.
Consulta nuestra sección de desarrollo en https://vmprof.readthedocs.org para más información.
vmprofshow
es una herramienta de línea de comandos que viene con VMProf . Puede leer archivos de perfil y producir una salida formateada.
A continuación se muestra un ejemplo de cómo utilizar vmprofshow
:
Ejecute ese pequeño programa que quema ciclos de CPU (con vmprof habilitado):
$ pypy vmprof/test/cpuburn.py # you can find cpuburn.py in the vmprof-python repo
Esto producirá un archivo de perfil vmprof_cpuburn.dat
. Ahora muestre el perfil usando vmprofshow
. vmprofshow
tiene múltiples modos de mostrar datos. Comenzaremos con el modo basado en árbol.
$ vmprofshow vmprof_cpuburn.dat tree
Verá una salida (en color):
$ 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
También existe la opción --html
para emitir la misma información que HTML para ver en un navegador. En este caso, las ramas de los árboles se pueden expandir y contraer interactivamente.
vmprof admite el modo de creación de perfiles de línea, que permite recopilar y mostrar estadísticas para líneas separadas dentro de funciones.
Para habilitar la recopilación de estadísticas de líneas, agregue el argumento --lines
a vmprof:
$ python -m vmprof --lines -o < output-file > < your program > < your program args >
O pase el argumento lines=True
a la función vmprof.enable
, al llamar a vmprof desde el código.
Para ver estadísticas de línea para todas las funciones, utilice el modo lines
de vmprofshow
:
$ vmprofshow < output-file > lines
Para ver estadísticas de línea para una función específica, use el argumento --filter
con el nombre de la función:
$ vmprofshow < output-file > lines --filter < function-name >
Verás el resultado:
$ 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
también tiene un modo flat
.
Si bien los estilos de salida basados en árboles y líneas para vmprofshow
brindan una buena vista de dónde se gasta el tiempo cuando se ven desde la "raíz" del gráfico de llamadas, a veces es deseable obtener una vista desde las "hojas". Esto es particularmente útil cuando existen funciones que se llaman desde múltiples lugares, donde cada invocación no consume mucho tiempo, pero todas las invocaciones en conjunto representan un costo sustancial.
$ 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
A veces puede resultar conveniente excluir funciones "nativas":
$ 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
Tenga en cuenta que la salida representa el tiempo dedicado a cada función, excluyendo las funciones llamadas. (En el modo --no-native
, los destinatarios de las llamadas con código nativo permanecen incluidos en el total).
A veces también puede ser conveniente que los tiempos incluyan las funciones llamadas:
$ 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
Esta vista es bastante similar a la vista de "árbol", menos el anidamiento.