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.

print('Took %.3f seconds' % (end - start))

>>>

Took 1.170 seconds

Rodar esse código em múltiplas threads no Python não resultaria em nenhum

ganho de velocidade porque a GIL impede que o Python use mais de uma CPU

em paralelo. No exemplo de código a seguir, implementamos a mesma

computação proposta pelo código anterior, mas desta vez usando o módulo

concurrent.futures com sua classe ThreadPoolExecutor e duas threads de

trabalho (no meu caso, usei duas porque é o número de núcleos que eu tenho

disponível na CPU de meu computador):

start = time()

pool = ThreadPoolExecutor(max_workers=2)

results = list(pool.map(gcd, numbers))

end = time()

print('Took %.3f seconds' % (end - start))

>>>

Took 1.199 seconds

Estranhamente, ficou mais lento ainda. Isso se deve ao trabalho adicional de

iniciar todas as threads e da comunicação entre o interpretador principal e o

conjunto de threads.

Porém, a surpresa maior é que, alterando apenas uma única linha de código, algo

mágico acontece. Se eu substituir ThreadPoolExecutor por

ProcessPoolExecutor, também do módulo concurrent.futures, tudo fica muito

mais rápido.

start = time()

pool = ProcessPoolExecutor(max_workers=2) # Única linha modificada

results = list(pool.map(gcd, numbers))

end = time()

print('Took %.3f seconds' % (end - start))

>>>

Took 0.663 seconds

Em minha máquina dual-core, é significativamente mais rápido! Como isso é

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!