Gebruik %lprun: los de bottleneck op
In de vorige oefening heb je de functie convert_units() geprofiled en gezien dat de list comprehension voor new_hts een mogelijke bottleneck was. Viel je ook op dat de list comprehension voor new_wts voor een vergelijkbaar percentage van de looptijd zorgde? Dat is een teken dat je new_hts en new_wts beter op een andere manier kunt aanmaken.
Omdat de lengte en het gewicht van elke held in een numpy-array zijn opgeslagen, kun je array-broadcasting gebruiken in plaats van list comprehensions om de lengtes en gewichten om te zetten. Dit is geïmplementeerd in de onderstaande functie:
def convert_units_broadcast(heroes, heights, weights):
# Array-broadcasting in plaats van 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
Laad het pakket line_profiler in je IPython-sessie. Gebruik daarna %lprun om de functie convert_units_broadcast() te profileren op je superheldendata. De functie convert_units_broadcast(), de lijst heroes, en de arrays hts en wts zijn al in je sessie geladen. Beantwoord na het coderen de volgende vraag:
Welk percentage van de tijd wordt besteed aan de regel met array-broadcasting voor new_hts, relatief aan de totale tijd in de functie convert_units_broadcast()?
Deze oefening maakt deel uit van de cursus
Efficiënte Python-code schrijven
Praktische interactieve oefening
Zet theorie om in actie met een van onze interactieve oefeningen.
Begin met trainen