Criador de perfil do Python, cProfile
gera relatórios que mostram quais funções ocupam mais tempo em um determinado programa Python. Por padrão, o código Cython não aparece nesses relatórios. No entanto, você pode habilitar a criação de perfil no código Cython inserindo uma diretiva do compilador na parte superior do .pyx
arquivo com funções que você deseja incluir na criação de perfil:
# cython: profile=True
Você também pode habilitar o rastreamento linha por linha no código C gerado pelo Cython. Fazer isso impõe muita sobrecarga, por isso está desativado por padrão. (A criação de perfil geralmente impõe sobrecarga, portanto, desative-a para o código que está sendo enviado para produção.)
Cython também pode gerar relatórios de código que indicam quanto de um determinado .pyx
arquivo está sendo convertido para C e quanto dele permanece como código Python. O setup.py
arquivo do nosso exemplo especificou isso com o annotate=True
declaração no cythonize()
função.
Exclua o .c
arquivos gerados no projeto e execute novamente o setup.py
script para recompilar tudo. Quando terminar, você deverá ver um arquivo HTML no mesmo diretório que compartilha o nome do seu .pyx
arquivo – neste caso, num.html
. Abra o arquivo HTML e você verá as partes do seu código que ainda dependem do Python destacadas em amarelo. Você pode clicar nas áreas amarelas para ver o código C subjacente gerado pelo Cython.
IDG
Neste caso, o def f
A função ainda está destacada em amarelo, apesar de ter suas variáveis digitadas explicitamente. Por que? Porque não é anotado explicitamente como uma função Cython. Cython assume qualquer função não anotada com @cython.cfunc
é apenas uma função Python e não conversível em C puro.
Você pode corrigir isso editando o def f
declaração para ler:
@cython.cfunc
def f(x: cython.double) -> cython.double:
Salve e recompile o arquivo e recarregue o relatório. Agora você deve ver o def f
a função não está mais destacada em amarelo; é puro C.
IDG
Observe que se você tiver a criação de perfil habilitada conforme descrito acima, mesmo funções C “puras” mostrarão algum destaque, porque foram decoradas com código de rastreamento que retorna aos componentes internos do Python.
Observe também que a operação de divisão na linha 12 também está destacada; isso ocorre porque o Cython insere automaticamente testes para divisão por zero e gera uma exceção Python, se for o caso. Você pode desativar isso com o cdivision
diretiva do compilador ou por meio de um decorador na função (@cython.cdivision(True)
).
Recursos Cython
Agora que você tem uma ideia de como o Cython se integra a um aplicativo Python existente, a próxima etapa é colocá-lo para funcionar em seus próprios aplicativos e fazer uso de outros recursos disponíveis: