5 Python Coding Errors That Are Killing Your Speed (And How to Fix Them Today)

19-Jun-24

คัมภีร์เทพ IT

See the original english version Click here!

 

เชื่อว่าพวกเราคงหงุดหงิดเวลาใช้งาน 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 เป็นเพื่อนนะคะ

เพิ่มเพื่อน

 

บทความล่าสุด