Utilizar %lprun: arreglar el cuello de botella
En el ejercicio anterior, hiciste un perfil de la función convert_units()
y viste que la comprensión de la lista new_hts
podía ser un posible cuello de botella. ¿Te has dado cuenta de que la comprensión de la lista new_wts
también representaba un porcentaje similar del tiempo de ejecución? Esto es una indicación de que tal vez quieras crear los objetos new_hts
y new_wts
utilizando una técnica diferente.
Como la altura y el peso de cada héroe se almacenan en un arreglo numpy
, puedes utilizar la emisión de arreglos en lugar de la comprensión de listas para convertir las alturas y los pesos. Esto se ha implementado en la siguiente función:
def convert_units_broadcast(heroes, heights, weights):
# Array broadcasting instead of list comprehension
new_hts = heights * 0.39370
new_wts = weights * 2.20462
hero_data = {}
for i,hero in enumerate(heroes):
hero_data[hero] = (new_hts[i], new_wts[i])
return hero_data
Carga el paquete line_profiler
en tu sesión IPython. A continuación, utiliza %lprun
para perfilar la función convert_units_broadcast()
que actúa sobre los datos de tus superhéroes. Se han cargado en tu sesión la función convert_units_broadcast()
, la lista heroes
, el arreglo hts
y el arreglo wts
. Cuando hayas terminado de codificar, responde a la siguiente pregunta:
¿Qué porcentaje de tiempo se dedica a la línea de código de emisión del arreglo new_hts
en relación con el tiempo total dedicado a la función convert_units_broadcast()
?
Este ejercicio forma parte del curso
Escribir código Python eficiente
Ejercicio interactivo práctico
Pon en práctica la teoría con uno de nuestros ejercicios interactivos
