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
Can you explain how to use the timeit module with functions instead of code strings?
What are some best practices for benchmarking code performance in Python?
Can you provide more examples of using timeit for different types of code?
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!