Folosirea %lprun: rezolvă blocajul
În exercițiul anterior, ai profilat funcția convert_units() și ai observat că list comprehension-ul pentru new_hts ar putea fi un potențial blocaj. Ai remarcat că list comprehension-ul pentru new_wts a contribuit cu un procent similar din timpul de execuție? Acesta este un indiciu că ar fi util să creezi obiectele new_hts și new_wts folosind o altă tehnică.
Deoarece înălțimea și greutatea fiecărui erou sunt stocate într-un array numpy, poți folosi broadcasting pe array-uri în loc de list comprehension pentru a converti înălțimile și greutățile. Această abordare a fost implementată în funcția de mai jos:
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
Încarcă pachetul line_profiler în sesiunea ta IPython. Apoi, folosește %lprun pentru a profila funcția convert_units_broadcast() aplicată pe datele supererouilor tăi. Funcția convert_units_broadcast(), lista heroes, array-ul hts și array-ul wts au fost deja încărcate în sesiune. După ce ai terminat de scris codul, răspunde la următoarea întrebare:
Ce procent din timp este alocat liniei de cod cu broadcasting pentru array-ul new_hts, raportat la timpul total petrecut în funcția convert_units_broadcast()?
Acest exercițiu face parte din cursul
Scriere eficientă a codului Python
Exercițiu interactiv practic
Transformă teoria în practică cu unul dintre exercițiile noastre interactive
Începe exercițiul