1
resposta

Arrays Numpy vs Listas no Python

Bom dia.

Replicando o exemplo de cálculo do quadrado de uma lista e um array para comparar a velocidade eu reparei que ao repetir a mesma execução várias vezes seguidas o tempo do cálculo com as listas vai caindo até 50% do valor anterior em cada execução e o tempo com o array permanece praticamente o mesmo, sendo independente do histórico. Isso significa que as listas permanecem em memória por mais tempo e por isso a reexecução do mesmo código tem esse pseudo-ganho ?

1 resposta

Bom dia, Rodrigo.

Que observação perspicaz, meus parabéns por ter notado isso. Não é qualquer um que consegue descobrir esse padrão.

Vou te dar um breve resumo dessa incrível funcionalidade do Python.

Antes, aqui está o TLDR;

    Numpy é escrito em C. Portanto, é muito mais rápido, mas não recebe as otimizações do interpretador Python. Código Python, como no caso de operações com listas passam por otimização do interpretador quando o código aparenta ser muito utilizado (ou seja, a mesma linha é rodada muitas vezes).

Primeiramente, não é um pseudo-ganho, é um ganho real, pois isso acontece, por exemplo, se você tiver um programa que contém uma função que é executada várias vezes, fazendo com que aquela linha de código seja rodada várias vezes, isso vai se repetir.

Com relação às arrays não ficarem mais eficientes com o tempo: A biblioteca numpy é extremamente mais rápida que o mesmo código usando Python normal, pois a biblioteca é escrita em C, uma linguagem mais eficiente e veloz para atividades de processamento intenso que Python (Python em si é escrito em C, mas o código Python tem que ser interpretado em um processo complexo que não vou elucidar aqui, mas que, no final, temos um interpretador com código C muito complicado sendo usado para ler comandos vindos do seu código Python e interpretar eles), e, infinitamente mais rápida.

Como Numpy é escrito em C, ele é muito mais rápido que código escrito em Python, pois ele vai direto no C, ele não passa por esse processo complexo de interpretação. Contudo, exatamente por conta disso, o numpy não se beneficia dos processos que o interpretador Python usa para otimizar o seu código.

Já a lista, é código Python. Portanto, fazer operações escritas em Python com listas serão otimizadas pelo interpretador. Entre essas otimizações, existe uma que surgiu no Python 3.11 (estamos no 3.13 hoje, e o 3.14 vai ser lançado no fim do ano), que envolve otimizar o bytecode de python. Não irei me alongar nisso, a menos que peça, pois estaríamos caminhando por uma conversa mais complicada. Mas, se quiser, é só falar que eu explico.

Então, para resumir, a lista passa por uma otimização do interpretador python, que a array não passa por ser escrita diretamente em C.