15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

Em algum momento de nossa vida de programador Python atingimos o chamado

muro do desempenho, (performance wall, como é conhecido em inglês). Mesmo

depois de otimizar seu código (consulte o Item 58: “Meça os perfis de

desempenho antes de otimizar o código”), a execução dos seus programas pode

continuar muito lenta. Em computadores modernos, com cada vez mais núcleos

de CPU à medida em que novos modelos vão surgindo no mercado, é razoável

supor que uma das soluções possíveis seja o paralelismo. Como seria bom se

pudéssemos dividir o esforço de computação de nosso código em pequenos

pedaços e entregá-los a núcleos distintos para serem executados em paralelo, não

é mesmo?

Infelizmente, a Global Interpreter Lock (GIL) do Python impede o paralelismo

verdadeiro em threads (consulte o Item 37: “Use threads para bloquear I/O e

evitar paralelismo”), portanto essa opção está fora de cogitação. Outra sugestão

bastante comum é reescrever em linguagem C o trecho de código que mais sofre

com problemas de desempenho. O C é uma linguagem que chega muito perto do

baixo nível, ou seja, “fala” diretamente com o hardware. Por isso, é também

muito rápida, eliminando a necessidade de paralelismo em muitos casos. As

extensões em C podem, além disso, iniciar suas próprias threads nativas que

rodam em paralelo e utilizam múltiplos núcleos de CPU. A API do Python para

escrever extensões em C é muito bem documentada e uma ótima escolha, caso

precise de uma saída de emergência.

Contudo, reescrever seu código em tem um custo altíssimo. Trechos de código

que seriam curtos e absolutamente inteligíveis em Python podem tornar-se

palavrosos e complicados em C. Uma portagem dessa envergadura necessitaria

de muitos e profundos testes para garantir que a funcionalidade seja equivalente

à do código original em Python e que nenhum bug foi introduzido no processo.

Algumas vezes, o esforço vale a pena, o que explica o ecossistema bastante

diverso e populoso de módulos de extensão em C disponíveis para a comunidade

de programadores do Python. Esses módulos melhoram o desempenho de um

sem-número de tarefas como análise de texto (parsing), composição de imagens

e cálculo matricial. Existem até mesmo ferramentas de código aberto como o

Cython (http://cython.org/) e o Numba (http://numba.pydata.org/) que facilitam

sobremaneira a transição para o C.

O problema é que portar um trecho do seu programa para C não é suficiente na

maioria das vezes. Programas otimizados em Python não possuem um único

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!