Criador de perfil do Python, cProfilegera 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.

Um relatório de anotação de código Cython. Os destaques amarelos indicam partes do código que ainda dependem do tempo de execução do Python.

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.

Relatório de código Cython com anotação de função C pura.

A função Cython revisada, agora C puro, não gera destaques.

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: