使用 %lprun:修正效能瓶頸
在前一個練習中,你為 convert_units() 函式做了剖析,發現 new_hts 的列表生成式可能是效能瓶頸。你是否也注意到,new_wts 的列表生成式同樣佔了相近比例的執行時間?這表示你或許應該用不同的方法來建立 new_hts 與 new_wts。
由於每位英雄的身高與體重都存放在 numpy 陣列中,你可以用陣列廣播(array broadcasting)而不是列表生成式來進行單位轉換。以下函式已經這樣實作:
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
請把 line_profiler 套件載入到你的 IPython 工作階段,接著使用 %lprun 來剖析套用在你的超級英雄資料上的 convert_units_broadcast()。convert_units_broadcast() 函式、heroes 清單、hts 陣列與 wts 陣列都已載入到你的工作階段。完成程式碼後,回答下列問題:
在 convert_units_broadcast() 函式的總執行時間中,花在 new_hts 陣列廣播那一行程式碼的時間比例是多少?
本練習屬於課程
