5 Errors ที่ทำให้ Python Code ช้าลง รวมทั้งวิธีแก้ไข
19-มิ.ย.-24
คัมภีร์เทพ IT
เชื่อว่าพวกเราคงหงุดหงิดเวลาใช้งาน Website ที่ช้าหรืองานวิเคราะห์ข้อมูลที่กินเวลานานหลายชั่วโมง เพราะ Code ที่ช้าจะทำให้ผู้ที่เกี่ยวข้องทั้งหมดได้รับประสบการณ์ในด้านลบ และอาจส่งผลต่อความสำเร็จของ Project ด้วยซ้ำ ดังนั้นบทความนี้จะกล่าวถึง 5 Errors ที่ทำให้ Python Code ช้าลง รวมทั้งวิธีแก้ไข
1. การใช้ Looping
เชื่อว่าหลายคนคงคุ้นเคยและชื่นชอบ For Loop ที่ถูกสร้างมาเป็นอย่างดี เพราะมันเป็นรากฐานของงานของ Programmer มากมาย แต่เมื่อพูดถึงความเร็ว โดยเฉพาะอย่างยิ่งกับ Datasets ขนาดใหญ่ Loop ที่เชื่อถือได้เหล่านั้นอาจดูเหมือนเป็นการถ่วงมากกว่าการเพิ่มความเร็ว
ตัวอย่าง: มาบวกตัวเลขกัน
ลองนึกภาพว่า คุณจำเป็นต้องรวมค่า กำลังสองของ List ตัวเลขเป็นจำนวนมาก ๆ และนี่เป็นวิธีการใช้ Loop:
ดูเหมือนไม่น่าจะเป็นปัญหาอะไรใช่ไหม แต่สิ่งที่ซ่อนอยู่คือ Python ต้องทำการคำนวณเป็นอย่างมากสำหรับแต่ละElement
การแก้ไข: ใช้ NumPy เป็นตัวช่วย
นี่คือจุดที่ NumPy สามารถเข้ามาเป็น Superhero ทั้งหมดนี้เป็นเรื่องของการทำ Vectorization ด้วยการดำเนินการกับ Arrays ทั้งหมดพร้อมกัน ลองมาเขียน Code กันใหม่:
แทนที่จะสับเปลี่ยนทีละ Element เจ้า NumPy จะจัดการการคำนวณทั้งหมดให้ในคราวเดียว
Bonus: Comprehensible Compromise
List Comprehensions เป็นเหมือนจุดกึ่งกลางที่ซ่อนอยู่:
มันมักจะทำงานเร็วกว่า Loops แต่อาจไม่เท่ากับความสามารถที่แท้จริงของ NumPy สำหรับการคำนวณเชิงตัวเลข
2. ใช้เครื่องมือไม่เหมาะกับงาน
ลองจินตนาการถึง การสร้างบ้านด้วยค้อนเพียงอันเดียว แน่นอนว่าคุณสามารถทำมันให้สำเร็จได้ แต่มันคงยุ่งยากน่าดู ในทำนองเดียวกัน สำหรับ Python การอาศัย List เพียงอย่างเดียวเพื่อทำงานทั้งหมด ก็เหมือนกับการเขียน Program โดยผูกแขนข้างหนึ่งไว้ด้านหลัง
ตัวอย่าง: หมายเลขโทรศัพท์ อยู่ที่ไหน
สมมติว่า คุณมีรายชื่อผู้ติดต่อดังนี้:
การค้นหาหมายเลขของ Bob หมายถึง การ Scan รายการทั้งหมด ซึ่งอาจตรวจสอบผู้ติดต่อทุกรายทีละคน
การแก้ไข: Data Structures ที่มีพลังพิเศษ
- Dictionaries: หากคุณกำลังค้นหาด้วย Keyword (เช่น "ชื่อ") Dictionaries คือ ตัวช่วยชีวิตของคุณ
- Sets: จำเป็นต้องติดตาม Unique Website Visitors หรือไม่? ใช้ Sets เพื่อกำจัดรายการที่ Duplicates กันโดยอัตโนมัติ
3. การเพิ่มประสิทธิภาพ (เมื่อคุณมืดแปดด้าน)
คุณคงคุ้นเคยกับความรู้สึกเหมือนอยู่ในความมืดเมื่อคุณรู้สึกว่า Code ทำงานช้า แต่กลับไม่ทราบสาเหตุ มันก็คล้ายกับการพยายามซ่อมเพดานโดยที่ไม่ใช้ไฟฉาย ซึ่งมันคงน่าหงุดหงิด และนั่นก็ทำให้ Profilers เข้ามามีบทบาท
ตัวอย่าง: ผู้ร้ายที่ไม่คาดคิด
สมมติว่าคุณมี Function ที่ซับซ้อนในการคำนวณ Fibonacci Number คุณได้ทุ่มเทในการปรับปรุงคณิตศาสตร์ แต่มันก็ยังช้าอยู่ ปรากฎว่า ปัญหา Bottleneck อาจเป็นปัญหาที่ซ่อนอยู่ เช่น วิธีที่คุณบันทึกผลลัพธ์ลงในไฟล์
การแก้ไข: cProfile เป็นตัวช่วย
cProfile Module ซึ่งเป็น Built-in ของ Python เป็นตัวตรวจสอบประสิทธิภาพของคุณ นี่คือวิธีการใช้งาน:
สิ่งนี้ได้ให้สถิติที่น่าสนใจให้คุณ สิ่งสำคัญที่คุณควรดู:
- ncalls: มีการเรียกใช้ Function กี่ครั้ง
- tottime: เวลาทั้งหมดที่ใช้ใน Function
- cumtime: เช่นเดียวกับ tottime แต่มันรวมเวลาที่ใช้ใน Function ทั้งหมดที่ถูกเรียกใช้ภายในนั้นเข้าไปด้วย
ตัวเลขเหล่านี้จะระบุจุดที่เกิด Bottleneck ที่แท้จริงของคุณ ซึ่งจะช่วยให้คุณมุ่งความพยายามในการเพิ่มประสิทธิภาพไปยังจุดที่จะทำให้เกิดผลกระทบมากที่สุดได้
4. กับดัก DIY
เชื่อว่า หลายคนต้องการที่จะสร้างทุกอย่างตั้งแต่เริ่มต้นด้วยตัวเอง แต่บางครั้ง การพยายามสร้างสิ่งที่มีไว้ให้อยู่แล้วขึ้นมาใหม่ ก็เหมือนกับการตัดสินใจ “เดิน” ข้ามประเทศแทนที่จะขึ้น “เครื่องบิน” แต่ Python สามารถช่วยคุณด้วย Built-in Functions ได้อย่างเหลือเชื่อ
ตัวอย่าง: มาใช้ Sorted กัน
คุณเคยต้องการเรียงลำดับ List ของตัวเลขหรือไม่ คุณสามารถเขียนการใช้ Bubble Sort ของคุณ หรือสามารถใช้ Sorted() ของ Python ได้
อันที่จริง มีโอกาสที่ Custom Sorting Algorithm ของคุณ ไม่ได้ใกล้เคียงกับประสิทธิภาพของ Built-in เลยด้วยซ้ำ
การแก้ไข: มาสำรวจขุมสมบัติกัน
Standard Library ของ Python ถือเป็นเพื่อนที่ดีที่สุดของ Developer เรามาทำความรู้จักกับสิ่งเหล่านั้นกัน:
- itertools: เพิ่มพลังให้กับงานของคุณด้วย iterators
- heapq: สำหรับจัดการกับ heaps
- bisect: เก็บ List ที่เรียงลำดับไว้อย่างรวดเร็ว
ข้อควรระวัง: เวลาที่ใช้ในการเรียนรู้ Built-ins คือ เวลาที่คุณประหยัดไปในการเพิ่มประสิทธิภาพ
5. สนทนากับ Hard Drive ของคุณมากเกินไป
เชื่อว่าคุณคงพยายามทำให้ Memory (RAM) ของคอมพิวเตอร์ของคุณ เป็นพื้นที่ทำงานที่รวดเร็วเป็นพิเศษ และทำให้ Hard Disk ของคุณเป็นคลังข้อมูลที่ใช้ได้อย่างราบรื่น แต่ละครั้งที่คุณเข้าถึงหรือแก้ไข File ก็เปรียบเหมือนกับการส่ง Messenger ไป ๆ มา ๆ ซึ่งการสื่อสารไป-มาที่มากเกินไป ก็อาจทำให้ Code ของคุณเหมือนจะเริ่มรู้สึกว่า จำเป็นต้องรอคู่สนทนาก่อน
ตัวอย่าง: การชะลอให้ช้าลงทีละบรรทัด
สมมติว่า คุณกำลังประมวลผล Log File ขนาดใหญ่:
การอ่านแต่ละ line หมายถึง การดึงข้อมูลแยกต่างหากจาก Hard Drive ของคุณ
การแก้ไข: เน้นทำงานอย่างชาญฉลาดขึ้น ไม่ใช่หนักขึ้น
- Read ทั้งหมดในครั้งเดียว (หากสามารถทำได้): สำหรับ Files ขนาดเล็ก บางครั้งวิธีที่เร็วที่สุด คือการโหลดข้อมูลทั้งหมดเข้าสู่ Memory:
- การบัฟเฟอร์เพื่อการช่วยเหลือ: เมื่อคุณต้องการการควบคุมอย่างละเอียด การบัฟเฟอร์จะช่วยประหยัดเวลาได้:
ที่มา: https://python.plainenglish.io/
รับตำแหน่งงานไอทีใหม่ๆ ด้วยบริการ IT Job Alert
อัพเดทบทความจากคนวงในสายไอทีทาง LINE ก่อนใคร
อย่าลืมแอดไลน์ @techstarth เป็นเพื่อนนะคะ
บทความล่าสุด