Analisando o tempo de execução

Escrevendo código Python eficiente

Logan Thomas

Scientific Software Technical Trainer, Enthought

Por que medir o tempo do código?

  • Ajuda a escolher a abordagem de código ideal
  • Código mais rápido == mais eficiente!
Escrevendo código Python eficiente

Como medir o tempo do código?

  • Calcular o tempo com o comando mágico %timeit

  • Comandos mágicos: melhorias sobre a sintaxe normal do Python

    • Prefixados com "%"
    • Link para a doc (aqui)
    • Ver todos com %lsmagic
Escrevendo código Python eficiente

Usando %timeit

Código a ser temporizado

import numpy as np

rand_nums = np.random.rand(1000)

Cronometrando com %timeit

%timeit rand_nums = np.random.rand(1000)
8.61 µs ± 69.1 ns por loop (média ± desvio padrão de 7 execuções, 100000 loops cada)
Escrevendo código Python eficiente

Saída do %timeit

alt="Saída do comando mágico timeit"

Escrevendo código Python eficiente

Saída do %timeit

alt="Saída do comando mágico timeit com média e desvio padrão destacados"

Escrevendo código Python eficiente

Saída do %timeit

alt="Saída do comando mágico timeit com número de execuções e de loops destacados"

Escrevendo código Python eficiente

Especificando execuções/loops

Definindo número de execuções (-r) e/ou loops (-n)

# Definir 2 execuções (-r2)
# Definir 10 loops (-n10)

%timeit -r2 -n10 rand_nums = np.random.rand(1000)
16.9 µs ± 5.14 µs por loop (média ± desvio padrão de 2 execuções, 10 loops cada)
Escrevendo código Python eficiente

Usando %timeit no modo line magic

Line magic (%timeit)

# Uma linha de código

%timeit nums = [x for x in range(10)]
914 ns ± 7.33 ns por loop (média ± desvio padrão de 7 execuções, 1000000 loops cada)
Escrevendo código Python eficiente

Usando %timeit no modo cell magic

Cell magic (%%timeit)

# Várias linhas de código

%%timeit
nums = []
for x in range(10):
    nums.append(x)
1.17 µs ± 3.26 ns por loop (média ± desvio padrão de 7 execuções, 1000000 loops cada)
Escrevendo código Python eficiente

Salvando a saída

Salvando a saída em uma variável (-o)

times = %timeit -o rand_nums = np.random.rand(1000)
8.69 µs ± 91.4 ns por loop (média ± desvio padrão de 7 execuções, 100000 loops cada)
Escrevendo código Python eficiente
times.timings
[8.697893059998023e-06,
 8.651204760008113e-06,
 8.634270530001232e-06,
 8.66847825998775e-06,
 8.619398139999247e-06,
 8.902550710008654e-06,
 8.633500570012985e-06]
times.best
8.619398139999247e-06
times.worst
8.902550710008654e-06
Escrevendo código Python eficiente

Comparando tempos

Estruturas de dados podem ser criadas usando o nome formal

formal_list = list()
formal_dict = dict()
formal_tuple = tuple()

Estruturas de dados podem ser criadas com sintaxe literal

literal_list = []
literal_dict = {}
literal_tuple = ()
Escrevendo código Python eficiente
f_time = %timeit -o formal_dict = dict()
145 ns ± 1.5 ns por loop (média ± desvio padrão de 7 execuções, 10000000 loops cada)
l_time = %timeit -o literal_dict = {}
93.3 ns ± 1.88 ns por loop (média ± desvio padrão de 7 execuções, 10000000 loops cada)
diff = (f_time.average - l_time.average) * (10**9)
print('l_time better than f_time by {} ns'.format(diff))
l_time better than f_time by 51.90819192857814 ns
Escrevendo código Python eficiente

Comparando tempos

%timeit formal_dict = dict()
145 ns ± 1.5 ns por loop (média ± desvio padrão de 7 execuções, 10000000 loops cada)
%timeit literal_dict = {}
93.3 ns ± 1.88 ns por loop (média ± desvio padrão de 7 execuções, 10000000 loops cada)
Escrevendo código Python eficiente

Preparar, apontar, valendo!

Escrevendo código Python eficiente

Preparing Video For Download...