Noçõ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.
123456789101112131415import 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')
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
timeitutilizatime.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 otime.time(); - 
Repetição automática: o
timeitexecuta 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. 
1234567import 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')
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()?
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
Awesome!
Completion rate improved to 7.69
Noçõ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.
123456789101112131415import 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')
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
timeitutilizatime.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 otime.time(); - 
Repetição automática: o
timeitexecuta 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. 
1234567import 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')
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()?
Obrigado pelo seu feedback!