Examinar el tiempo de ejecución

Cómo escribir código Python eficiente

Logan Thomas

Scientific Software Technical Trainer, Enthought

¿Por qué cronometrar el código?

  • Nos permite elegir el enfoque de código óptimo
  • Código más rápido = código más eficiente
Cómo escribir código Python eficiente

¿Cómo cronometrar el código?

  • Calcula el tiempo con la orden mágica de IPython %timeit

  • Comandos mágicos: mejoras sobre la sintaxis normal de Python

    • Empiezan con "%"
    • Enlace a la documentación (aquí)
    • Ver todos los comandos con %lsmagic
Cómo escribir código Python eficiente

Usar %timeit

Código a cronometrar

import numpy as np

rand_nums = np.random.rand(1000)

Cronometrar con %timeit

%timeit rand_nums = np.random.rand(1000)
8.61 µs ± 69.1 ns por bucle (media ± desv. estándar de 7 ejecuciones, 100000 bucles cada una)
Cómo escribir código Python eficiente

Salida de %timeit

alt="Salida de la orden mágica timeit"

Cómo escribir código Python eficiente

Salida de %timeit

alt="Salida de la orden mágica timeit con media y desviación estándar resaltadas"

Cómo escribir código Python eficiente

Salida de %timeit

alt="Salida de la orden mágica timeit con número de ejecuciones y bucles resaltados"

Cómo escribir código Python eficiente

Especificar ejecuciones/bucles

Configurar número de ejecuciones (-r) y/o bucles (-n)

# Set number of runs to 2 (-r2)
# Set number of loops to 10 (-n10)

%timeit -r2 -n10 rand_nums = np.random.rand(1000)
16.9 µs ± 5.14 µs por bucle (media ± desv. estándar de 2 ejecuciones, 10 bucles cada una)
Cómo escribir código Python eficiente

Usar %timeit en modo línea

Magia de línea (%timeit)

# Single line of code

%timeit nums = [x for x in range(10)]
914 ns ± 7.33 ns por bucle (media ± desv. estándar de 7 ejecuciones, 1000000 bucles cada una)
Cómo escribir código Python eficiente

Usar %timeit en modo celda

Magia de celda (%%timeit)

# Multiple lines of code

%%timeit
nums = []
for x in range(10):
    nums.append(x)
1.17 µs ± 3.26 ns por bucle (media ± desv. estándar de 7 ejecuciones, 1000000 bucles cada una)
Cómo escribir código Python eficiente

Guardar salida

Guardar la salida en una variable (-o)

times = %timeit -o rand_nums = np.random.rand(1000)
8.69 µs ± 91.4 ns por bucle (media ± desv. estándar de 7 ejecuciones, 100000 bucles cada una)
Cómo escribir 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
Cómo escribir código Python eficiente

Comparar tiempos

Las estructuras de datos de Python se pueden crear con el nombre formal

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

Las estructuras de datos de Python se pueden crear con sintaxis literal

literal_list = []
literal_dict = {}
literal_tuple = ()
Cómo escribir código Python eficiente
f_time = %timeit -o formal_dict = dict()
145 ns ± 1.5 ns por bucle (media ± desv. estándar de 7 ejecuciones, 10000000 bucles cada una)
l_time = %timeit -o literal_dict = {}
93.3 ns ± 1.88 ns por bucle (media ± desv. estándar de 7 ejecuciones, 10000000 bucles cada una)
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
Cómo escribir código Python eficiente

Comparar tiempos

%timeit formal_dict = dict()
145 ns ± 1.5 ns por bucle (media ± desv. estándar de 7 ejecuciones, 10000000 bucles cada una)
%timeit literal_dict = {}
93.3 ns ± 1.88 ns por bucle (media ± desv. estándar de 7 ejecuciones, 10000000 bucles cada una)
Cómo escribir código Python eficiente

¡A correr!

Cómo escribir código Python eficiente

Preparing Video For Download...