PyPy: เร็วขึ้นจริง? หรือแค่ข่าวลือ? มาลองดูกัน!
ก็อย่างที่รู้ๆ กันแหละ Python เนี่ย เขียนง่าย โค้ดสวย แต่เรื่องความเร็วนี่… อืมมม บางทีก็ทำเอาเราท้อใจได้เหมือนกันนะ โดยเฉพาะโปรเจกต์ที่ต้องคำนวณหนักๆ หรือมี Loop เยอะๆ
ทีนี้ ไอ้เจ้า PyPy เนี่ย มันก็ผุดขึ้นมาเป็นความหวังของผู้ที่อยากได้ Python ที่เร็วขึ้น! พูดง่ายๆ เลยนะ มันคือ Python อีกเวอร์ชันนึง ที่เค้าพัฒนามาเพื่อแก้ปัญหาเรื่องความเร็วเนี่ยแหละ จุดเด่นของมันคือมี JIT (Just-In-Time) Compiler ในตัว ทำให้โค้ด Python ของเรามันถูกแปลงเป็น machine code ตอนรัน ซึ่งมันเร็วกว่าการตีความโค้ด (interpret) แบบ Python ปกติเยอะเลยล่ะ!
ติดตั้ง PyPy ยังไง?
ง่ายมากเลยครับ ถ้าคุณใช้ pyenv ก็สบายๆ เลย
# ติดตั้ง pyenv ก่อน ถ้ายังไม่มี
# curl https://pyenv.run | bash
# ลง PyPy เวอร์ชั่นล่าสุด (หรือเวอร์ชันที่คุณต้องการ)
pyenv install pypy3.9-7.3.11 # ตัวเลขเวอร์ชั่นอาจจะเปลี่ยนไปนะ เช็คในเว็บ PyPy ก่อน
# ตั้งค่าให้ใช้ PyPy
pyenv global pypy3.9-7.3.11
# หรือจะใช้แบบ local ในโปรเจกต์ก็ได้
# pyenv local pypy3.9-7.3.11
ถ้าไม่ได้ใช้ pyenv ก็ไปโหลดไฟล์จาก เว็บ PyPy มาแตกไฟล์เอาเองก็ได้ แล้วก็เพิ่ม Path ไปใน PATH environment variable ของคุณ
มาลองของกันหน่อย!
ลองเขียนโค้ดง่ายๆ ที่กินเวลาประมวลผลหน่อย อย่างเช่น การคำนวณ Fibonacci แบบ Recursive ที่ไม่ได้ Optimize อะไรเลยเนี่ยแหละ
สร้างไฟล์ fib.py:
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n-1) + fibonacci(n-2)
if __name__ == '__main__':
import time
n = 35 # เลขเยอะหน่อย จะได้เห็นผลชัดๆ
start_time = time.time()
result = fibonacci(n)
end_time = time.time()
print(f"Fibonacci({n}) = {result}")
print(f"เวลาที่ใช้: {end_time - start_time:.4f} วินาที")
ทีนี้เรามาลองรันด้วย Python ปกติ กับ PyPy กัน
รันด้วย Python ปกติ (CPython):
python fib.py
คุณอาจจะได้ผลลัพธ์ประมาณนี้ (ขึ้นอยู่กับเครื่องของคุณนะ)
Fibonacci(35) = 9227465
เวลาที่ใช้: 3.5123 วินาที
รันด้วย PyPy:
pypy fib.py
ส่วน PyPy ล่ะ? คุณอาจจะตกใจกับผลที่ได้!
Fibonacci(35) = 9227465
เวลาที่ใช้: 0.0034 วินาที
เห็นความแตกต่างไหม? มันเร็วกว่ากันคนละโลกเลยใช่มั้ยล่ะ! นี่แหละพลังของ JIT Compiler มันจะเรียนรู้พฤติกรรมการรันโค้ดของคุณ แล้ว Optimize ให้โค้ดทำงานได้เร็วขึ้นเรื่อยๆ
PyPy ไม่ใช่ยาวิเศษนะ! (ข้อควรระวัง)
ใช่ครับ มันเร็ว แต่มันไม่ได้เหมาะกับทุกสถานการณ์นะ จากประสบการณ์ตรงเลยนะ เคยเจอมากับตัว… PyPy มันมีจุดอ่อนที่สำคัญมากๆ คือ การทำงานกับ C Extensions
ถ้าโปรเจกต์ของคุณไปใช้ไลบรารีที่ถูกเขียนด้วย C หรือ C++ เยอะๆ (ซึ่งไลบรารีสาย Data Science อย่าง NumPy, Pandas, TensorFlow เนี่ย ตัวดีเลย) PyPy มันอาจจะไม่ได้ให้ประสิทธิภาพที่ดีอย่างที่คิด บางทีมันอาจจะช้ากว่า Python ปกติ หรือแย่กว่านั้นคือ รันไม่ได้เลย! เพราะ PyPy มันมีวิธีจัดการกับ C Extensions ที่ต่างจาก CPython (Python ปกติ) ทำให้บางไลบรารีที่ไม่ได้ออกแบบมาเพื่อ PyPy โดยเฉพาะ มันจะเอ๋อๆ
ตอนนั้นแหละ มีโปรเจกต์ที่ต้องใช้ scipy หนักๆ เลย ลองเอา PyPy ไปรันดู คิดว่าจะเร็วขึ้น ปรากฏว่าไม่รอดครับ! เจอ Error เพียบ แล้วถึงรันได้ ก็โคตรช้าเลย สรุปคือต้องถอยกลับมาใช้ Python ปกติเหมือนเดิม
# ตัวอย่างปัญหาที่อาจเจอเมื่อติดตั้ง package ที่มี C extension เยอะๆ
pypy -m pip install numpy
# อาจจะเจอ error เกี่ยวกับการคอมไพล์ หรือเวอร์ชันไม่ตรง
# บางทีก็ช้ากว่าปกติ
อีกเรื่องคือ PyPy มันใช้ Memory เยอะกว่า Python ปกติเล็กน้อยนะ ถ้า Memory เป็นปัญหาสำหรับคุณ อันนี้ก็ต้องคิดดีๆ
สรุป: ควรใช้ PyPy ตอนไหนดี?
PyPy เหมาะมากๆ สำหรับ
- โค้ดที่เน้น CPU-bound: คือโค้ดที่ต้องคำนวณเยอะๆ มี Loop ซับซ้อน หรือ Logic ที่กินเวลาประมวลผลมากๆ
- โปรเจกต์ที่ไม่ได้ใช้ C Extensions มากมาย: เช่น Web Framework (Flask, Django เบาๆ), Script ทั่วไป, หรือ Bot เล็กๆ ที่เน้น Logic Python เพียวๆ
แต่ถ้าโปรเจกต์ของคุณคือสาย Data Science, Machine Learning ที่พึ่งพา NumPy, Pandas, SciPy, TensorFlow, PyTorch เป็นหลัก... บอกเลยว่า PyPy ไม่ใช่ทางออกที่ดีที่สุดในตอนนี้ครับ อาจจะต้องมองหาทางอื่น อย่างเช่น การ Optimize Algorithm, ใช้ Cython, หรือย้ายไปใช้ภาษาอื่นที่เร็วกว่าเลย
หวังว่าบทความนี้จะช่วยให้คุณเข้าใจ PyPy มากขึ้นนะ ใครที่ยังไม่เคยลอง ก็ไปลองเล่นกันดู แล้วคุณอาจจะทึ่งในความเร็วของมันก็ได้!