Uso di %lprun: risolvi il collo di bottiglia
Nell'esercizio precedente, hai profilato la funzione convert_units() e hai visto che la list comprehension new_hts poteva essere un potenziale collo di bottiglia. Hai notato che anche la list comprehension new_wts incideva in modo simile sul tempo di esecuzione? Questo suggerisce che potresti voler creare gli oggetti new_hts e new_wts usando una tecnica diversa.
Dato che l'altezza e il peso di ogni eroe sono archiviati in un array numpy, puoi usare il broadcasting degli array invece delle list comprehension per convertire altezze e pesi. Questo è già implementato nella funzione seguente:
def convert_units_broadcast(heroes, heights, weights):
# Array broadcasting invece di 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
Carica il pacchetto line_profiler nella tua sessione IPython. Poi usa %lprun per profilare la funzione convert_units_broadcast() applicata ai tuoi dati dei supereroi. La funzione convert_units_broadcast(), la lista heroes, e gli array hts e wts sono già stati caricati nella sessione. Dopo aver scritto il codice, rispondi alla seguente domanda:
Quale percentuale di tempo è spesa sulla riga di codice di broadcasting dell'array new_hts rispetto al tempo totale trascorso nella funzione convert_units_broadcast()?
Questo esercizio fa parte del corso
Scrivere codice Python efficiente
Esercizio pratico interattivo
Passa dalla teoria alla pratica con uno dei nostri esercizi interattivi
Inizia esercizio