Acesse https://vmprof.readthedocs.org para mais informações!
pip install vmprof
python -m vmprof <your program> <your program args>
Nosso sistema de construção envia rodas para PyPI (Linux, Mac OS X). Se você construir a partir do código-fonte, precisará instalar os cabeçalhos de desenvolvimento CPython e os cabeçalhos libunwind (somente no Linux). No Windows, isso significa que você precisa do Microsoft Visual C++ Compiler para sua versão Python.
A configuração do desenvolvimento pode ser feita usando os seguintes comandos:
$ virtualenv -p /usr/bin/python3 vmprof3
$ source vmprof3/bin/activate
$ python setup.py develop
Você precisa instalar pacotes de desenvolvimento python. No caso, por exemplo, de Debian ou Ubuntu, o pacote que você precisa é python3-dev
e libunwind-dev
. Agora é hora de escrever um teste e implementar seu recurso. Se você deseja que suas alterações afetem o vmprof.com, acesse https://github.com/vmprof/vmprof-server e siga as instruções de configuração.
Consulte nossa seção de desenvolvimento em https://vmprof.readthedocs.org para obter mais informações.
vmprofshow
é uma ferramenta de linha de comando que vem com VMProf . Ele pode ler arquivos de perfil e produzir uma saída formatada.
Aqui está um exemplo de como usar vmprofshow
:
Execute aquele pequeno programa que queima ciclos de CPU (com vmprof habilitado):
$ pypy vmprof/test/cpuburn.py # you can find cpuburn.py in the vmprof-python repo
Isso produzirá um arquivo de perfil vmprof_cpuburn.dat
. Agora exiba o perfil usando vmprofshow
. vmprofshow
possui vários modos de exibição de dados. Começaremos com o modo baseado em árvore.
$ vmprofshow vmprof_cpuburn.dat tree
Você verá uma saída (colorida):
$ 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
Também existe uma opção --html
para emitir as mesmas informações que o HTML para visualizar em um navegador. Nesse caso, os galhos da árvore podem ser expandidos e recolhidos interativamente.
vmprof suporta o modo de perfil de linha, que permite coletar e mostrar estatísticas para linhas separadas dentro de funções.
Para ativar a coleta de estatísticas de linhas, adicione o argumento --lines
ao vmprof:
$ python -m vmprof --lines -o < output-file > < your program > < your program args >
Ou passe o argumento lines=True
para a função vmprof.enable
, ao chamar vmprof do código.
Para ver as estatísticas de linha de todas as funções, use o modo lines
do vmprofshow
:
$ vmprofshow < output-file > lines
Para ver as estatísticas de linha de uma função específica, use o argumento --filter
com o nome da função:
$ vmprofshow < output-file > lines --filter < function-name >
Você verá o 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
também possui um modo flat
.
Embora os estilos de saída baseados em árvore e linha para vmprofshow
forneçam uma boa visão de onde o tempo é gasto quando visualizado a partir da 'raiz' do gráfico de chamada, às vezes é desejável obter uma visualização a partir de 'folhas'. Isto é particularmente útil quando existem funções que são chamadas de vários locais, onde cada invocação não consome muito tempo, mas todas as invocações juntas representam um custo substancial.
$ 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
Às vezes pode ser desejável excluir funções "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
Observe que a saída representa o tempo gasto em cada função, excluindo as funções chamadas. (No modo --no-native
, os destinatários do código nativo permanecem incluídos no total.)
Às vezes também pode ser desejável obter tempos que incluam as funções chamadas:
$ 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 visualização é bastante semelhante à visualização em "árvore", sem o aninhamento.