การใช้ %lprun: แก้ไข bottleneck
ในแบบฝึกหัดที่แล้ว คุณได้ทำการ profile ฟังก์ชัน convert_units() และพบว่า list comprehension ของ new_hts อาจเป็น bottleneck ที่ควรแก้ไข สังเกตไหมว่า list comprehension ของ new_wts ก็ใช้เวลาคิดเป็นสัดส่วนใกล้เคียงกันด้วย นั่นเป็นสัญญาณว่าควรลองสร้างออบเจ็กต์ new_hts และ new_wts ด้วยเทคนิคอื่น
เนื่องจากข้อมูลความสูงและน้ำหนักของแต่ละฮีโร่ถูกเก็บไว้ใน numpy array จึงสามารถใช้ array broadcasting แทน list comprehension ในการแปลงค่าได้ ซึ่งได้นำไปใช้งานในฟังก์ชันด้านล่างแล้ว:
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 session จากนั้นใช้ %lprun เพื่อ profile ฟังก์ชัน convert_units_broadcast() กับข้อมูลซูเปอร์ฮีโร่ของคุณ ฟังก์ชัน convert_units_broadcast(), รายการ heroes, array hts และ array wts ถูกโหลดเข้า session แล้ว เมื่อเขียนโค้ดเสร็จแล้ว ให้ตอบคำถามต่อไปนี้:
บรรทัดโค้ดที่ใช้ array broadcasting สำหรับ new_hts ใช้เวลาคิดเป็นกี่เปอร์เซ็นต์ของเวลาทั้งหมดที่ฟังก์ชัน convert_units_broadcast() ใช้ไป?
แบบฝึกหัดนี้เป็นส่วนหนึ่งของหลักสูตร
การเขียน Python Code ที่มีประสิทธิภาพ
แบบฝึกหัดเชิงโต้ตอบแบบลงมือทำจริง
เปลี่ยนทฤษฎีให้เป็นการลงมือทำด้วยแบบฝึกหัดเชิงโต้ตอบหนึ่งในของเรา
เริ่มแบบฝึกหัด