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.

fator determinante de lentidão. Em vez disso, há muitos elementos que

contribuem para tal. Para que os benefícios de usar threads e estar mais próximo

do hardware com o C possam ser empregados, seria necessário portar trechos

muito grandes do programa, aumentando drasticamente o risco e as necessidades

de teste. Deve haver uma maneira melhor de preservar seu investimento em

Python para resolver problemas computacionais difíceis.

O módulo nativo multiprocessing, facilmente acessível por dentro de outro

módulo nativo, concurrent.futures, é exatamente o que precisamos. Esse módulo

permite que o Python utilize mais de um núcleo de CPU em paralelo, e o faz de

maneira surpreendentemente simples: rodando em paralelo instâncias adicionais

do interpretador do Python como processos-filho. Tais processos são separados

do interpretador principal, portanto cada um dos processos-filho tem uma GIL

separada para si. Cada processo-filho tem permissão de utilizar apenas um

núcleo de CPU, e possui uma conexão com o processo principal, por onde

recebe instruções para computar e devolve os resultados.

Por exemplo, digamos que se queira realizar uma tarefa computacionalmente

intensiva com o Python e usar múltiplos núcleos de CPU. Usarei o problema de

encontrar o maior divisor comum entre dois números como substituto para um

algoritmo mais intenso computacionalmente, como a simulação da dinâmica dos

fluídos com a equação de Navier-Stokes.

def gcd(pair):

a, b = pair

low = min(a, b)

for i in range(low, 0, -1):

if a % i == 0 and b % i == 0:

return i

Rodar essa função em série aumenta linearmente a quantidade de tempo de

processamento porque não há paralelismo.

numbers = [(1963309, 2265973), (2030677, 3814172),

(1551645, 2229620), (2039045, 2020802)]

start = time()

results = list(map(gcd, numbers))

end = time()

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!