IniziaInizia gratis

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

Visualizza il corso

Esercizio pratico interattivo

Passa dalla teoria alla pratica con uno dei nostri esercizi interattivi

Inizia esercizio