%lprun を使う:ボトルネックを修正する
前の演習では、convert_units() 関数をプロファイルし、new_hts のリスト内包表記がボトルネックになり得ることを確認しました。new_wts のリスト内包表記も、実行時間の同程度の割合を占めていたことに気づきましたか? これは、new_hts と new_wts を別の方法で作成したほうがよいことを示しています。
各ヒーローの身長と体重は numpy 配列に保存されているので、リスト内包表記ではなく配列のブロードキャストで変換できます。以下の関数にその方法を実装しています。
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 配列のブロードキャストを行うコード行に費やされた時間の割合はどれくらいですか?
この演習はコースの一部です
