Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Aprenda Noções Básicas de Temporização e Benchmarking | Compreensão e Medição de Desempenho
Técnicas de Otimização em Python

bookNoções Básicas de Temporização e Benchmarking

Como não estamos enfatizando a análise de complexidade de tempo neste curso, o foco será em métodos empíricos (práticos) para medir o desempenho real do código. Uma das formas mais simples de medir o desempenho de um trecho de código é utilizando a função embutida time.time().

Essa função retorna o tempo atual em segundos desde a época (o ponto de referência do sistema para o tempo). Chamando time.time() antes e depois de um trecho de código, é possível calcular a diferença para saber quanto tempo levou para executar.

123456789101112131415
import time # Record the start time start_time = time.time() # Code you want to measure result = [x**2 for x in range(1000000)] # Record the end time end_time = time.time() # Calculate the difference to get the execution time execution_time = end_time - start_time print(f'Execution time: {execution_time} seconds')
copy

Embora o uso de time.time() seja simples e eficaz para estimativas aproximadas, ele apresenta várias limitações:

  • Baixa resolução: a precisão de time.time() pode variar dependendo do sistema operacional, resultando em resultados imprecisos para operações pequenas;
  • Sobrecarga: inclui outros processos do sistema em execução em segundo plano, o que pode distorcer a medição;
  • Não repete: para medições mais precisas, geralmente é necessário executar o mesmo código várias vezes para obter um resultado médio, algo que time.time() não faz automaticamente.

Vantagens de Usar o timeit

O módulo timeit é uma ferramenta mais avançada, projetada para superar as limitações do time.time() e fornecer uma maneira confiável de medir o tempo de execução de pequenos trechos de código, frequentemente chamados de micro-benchmarking.

As principais vantagens do timeit são:

  • Alta precisão: o timeit utiliza time.perf_counter() internamente, um temporizador de alta resolução que inclui o tempo gasto durante o sono e espera por I/O, tornando-o mais preciso para intervalos curtos do que o time.time();

  • Repetição automática: o timeit executa automaticamente o código várias vezes e calcula o tempo médio de execução. Isso ajuda a mitigar os efeitos de processos em segundo plano, fornecendo uma medida mais confiável do desempenho do código;

  • Sobrecarga mínima: o timeit é projetado para rodar em um ambiente limpo, desabilitando temporariamente a coleta de lixo para garantir que as medições foquem no código sendo avaliado, sem interferência de operações de gerenciamento de memória.

1234567
import timeit # Code snippet to test code_snippet = 'result = [x**2 for x in range(1000000)]' # Running timeit to measure execution time iterations = 30 execution_time = timeit.timeit(code_snippet, number=iterations) print(f'Average Execution Time: {execution_time / iterations} seconds')
copy

Neste exemplo, timeit.timeit() executa o código especificado como uma string (variável code_snippet) 30 vezes (definido pelo parâmetro number) e retorna o tempo total de execução para todas as 30 execuções. Ao dividir o tempo total pelo número de iterações (30), é possível calcular o tempo médio de execução para uma única execução.

Escolhendo o Número de Iterações

A escolha do número de iterações depende da complexidade do código que está sendo avaliado e da precisão exigida nos resultados de tempo. Executar o código com diferentes quantidades de iterações permite avaliar a estabilidade dos resultados; se os tempos de execução forem consistentes, provavelmente foi encontrado um número de iterações ideal.

Para trechos de código muito rápidos (milissegundos ou menos), utilize 1000+ iterações para obter médias confiáveis. Para códigos com tempo moderado (alguns milissegundos a segundos), 100 a 500 iterações geralmente são suficientes. Para códigos de execução mais longa (vários segundos ou mais), 10 a 50 iterações costumam proporcionar um bom equilíbrio entre precisão e tempo gasto na avaliação de desempenho.

1. Qual função oferece alta precisão e executa automaticamente o código várias vezes para calcular o tempo médio de execução?

2. Por que o uso de time.time() para medição de desempenho pode ser menos confiável do que timeit.timeit()?

question mark

Qual função oferece alta precisão e executa automaticamente o código várias vezes para calcular o tempo médio de execução?

Select the correct answer

question mark

Por que o uso de time.time() para medição de desempenho pode ser menos confiável do que timeit.timeit()?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 1. Capítulo 2

Pergunte à IA

expand

Pergunte à IA

ChatGPT

Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo

Awesome!

Completion rate improved to 7.69

bookNoções Básicas de Temporização e Benchmarking

Deslize para mostrar o menu

Como não estamos enfatizando a análise de complexidade de tempo neste curso, o foco será em métodos empíricos (práticos) para medir o desempenho real do código. Uma das formas mais simples de medir o desempenho de um trecho de código é utilizando a função embutida time.time().

Essa função retorna o tempo atual em segundos desde a época (o ponto de referência do sistema para o tempo). Chamando time.time() antes e depois de um trecho de código, é possível calcular a diferença para saber quanto tempo levou para executar.

123456789101112131415
import time # Record the start time start_time = time.time() # Code you want to measure result = [x**2 for x in range(1000000)] # Record the end time end_time = time.time() # Calculate the difference to get the execution time execution_time = end_time - start_time print(f'Execution time: {execution_time} seconds')
copy

Embora o uso de time.time() seja simples e eficaz para estimativas aproximadas, ele apresenta várias limitações:

  • Baixa resolução: a precisão de time.time() pode variar dependendo do sistema operacional, resultando em resultados imprecisos para operações pequenas;
  • Sobrecarga: inclui outros processos do sistema em execução em segundo plano, o que pode distorcer a medição;
  • Não repete: para medições mais precisas, geralmente é necessário executar o mesmo código várias vezes para obter um resultado médio, algo que time.time() não faz automaticamente.

Vantagens de Usar o timeit

O módulo timeit é uma ferramenta mais avançada, projetada para superar as limitações do time.time() e fornecer uma maneira confiável de medir o tempo de execução de pequenos trechos de código, frequentemente chamados de micro-benchmarking.

As principais vantagens do timeit são:

  • Alta precisão: o timeit utiliza time.perf_counter() internamente, um temporizador de alta resolução que inclui o tempo gasto durante o sono e espera por I/O, tornando-o mais preciso para intervalos curtos do que o time.time();

  • Repetição automática: o timeit executa automaticamente o código várias vezes e calcula o tempo médio de execução. Isso ajuda a mitigar os efeitos de processos em segundo plano, fornecendo uma medida mais confiável do desempenho do código;

  • Sobrecarga mínima: o timeit é projetado para rodar em um ambiente limpo, desabilitando temporariamente a coleta de lixo para garantir que as medições foquem no código sendo avaliado, sem interferência de operações de gerenciamento de memória.

1234567
import timeit # Code snippet to test code_snippet = 'result = [x**2 for x in range(1000000)]' # Running timeit to measure execution time iterations = 30 execution_time = timeit.timeit(code_snippet, number=iterations) print(f'Average Execution Time: {execution_time / iterations} seconds')
copy

Neste exemplo, timeit.timeit() executa o código especificado como uma string (variável code_snippet) 30 vezes (definido pelo parâmetro number) e retorna o tempo total de execução para todas as 30 execuções. Ao dividir o tempo total pelo número de iterações (30), é possível calcular o tempo médio de execução para uma única execução.

Escolhendo o Número de Iterações

A escolha do número de iterações depende da complexidade do código que está sendo avaliado e da precisão exigida nos resultados de tempo. Executar o código com diferentes quantidades de iterações permite avaliar a estabilidade dos resultados; se os tempos de execução forem consistentes, provavelmente foi encontrado um número de iterações ideal.

Para trechos de código muito rápidos (milissegundos ou menos), utilize 1000+ iterações para obter médias confiáveis. Para códigos com tempo moderado (alguns milissegundos a segundos), 100 a 500 iterações geralmente são suficientes. Para códigos de execução mais longa (vários segundos ou mais), 10 a 50 iterações costumam proporcionar um bom equilíbrio entre precisão e tempo gasto na avaliação de desempenho.

1. Qual função oferece alta precisão e executa automaticamente o código várias vezes para calcular o tempo médio de execução?

2. Por que o uso de time.time() para medição de desempenho pode ser menos confiável do que timeit.timeit()?

question mark

Qual função oferece alta precisão e executa automaticamente o código várias vezes para calcular o tempo médio de execução?

Select the correct answer

question mark

Por que o uso de time.time() para medição de desempenho pode ser menos confiável do que timeit.timeit()?

Select the correct answer

Tudo estava claro?

Como podemos melhorá-lo?

Obrigado pelo seu feedback!

Seção 1. Capítulo 2
some-alt