ชุมชน Python กำลังคึกคักไปด้วยการอพิพากษาเกี่ยวกับการปรับปรุงประสิทธิภาพ โดยเฉพาะอย่างยิ่งเรื่อง JIT compiler ของ Facebook ชื่อ Cinder และการใช้งาน PyPy ที่มักถูกมองข้าม ในขณะที่ความสนใจส่วนใหญ่มุ่งไปที่การรวม JIT compilation เข้ากับ CPython interpreter หลัก นักพัฒนาหลายคนตั้งคำถามว่าทำไมโซลูชันที่ประสบความสำเร็จแล้วจึงไม่ได้รับการยอมรับที่สมควร
PyPy ส่งมอบผลการปรับปรุงประสิทธิภาพในโลกจริง
PyPy ซึ่งเป็นการใช้งาน Python ที่เขียนด้วย Python เองนั้น ได้ส่งมอบการปรับปรุงประสิทธิภาพที่น่าประทับใจอย่างเงียบ ๆ มานานกว่าทศวรรษ สมาชิกชุมชนรายงานการเพิ่มความเร็วอย่างมากในสภาพแวดล้อมการใช้งานจริง โดยบางคนเห็นเวลาในการประมวลผลลดลงจากหลายชั่วโมงเหลือเพียงไม่กี่นาทีเพียงแค่เปลี่ยนตัวแปลภาษา การใช้งานนี้ขณะนี้รองรับฟีเจอร์ของ Python 3.12 และรักษาความเข้ากันได้กับแพ็กเกจ Python ส่วนใหญ่
การทดสอบประสิทธิภาพในโลกจริงแสดงให้เห็นว่า PyPy ส่งมอบการปรับปรุงประสิทธิภาพ 4 เท่าอย่างสม่ำเสมอในงานต่าง ๆ เว็บแอปพลิเคชันที่ใช้ Flask เห็นผลที่คล้ายกัน โดยนักพัฒนาคนหนึ่งรายงานว่าได้ 8,127 ธุรกรรมต่อวินาทีเมื่อเทียบกับ CPython ที่ได้ 4,512 ธุรกรรมต่อวินาทีในสภาพแวดล้อมการทดสอบเดียวกัน
PyPy: การใช้งาน Python ที่ใช้ Just-In-Time compilation เพื่อให้ได้การปรับปรุงประสิทธิภาพที่สำคัญเมื่อเทียบกับ CPython interpreter มาตรฐาน
การเปรียบเทียบประสิทธิภาพ
- PyPy : ปรับปรุงความเร็วเฉลี่ย 4 เท่าเมื่อเทียบกับ CPython
- Cinder JIT : เพิ่มความเร็ว 4 เท่าในบางงาน (ผลลัพธ์ไม่สม่ำเสมอ)
- PyPy Flask benchmark : 8,127 trans/sec เทียบกับ CPython ที่ 4,512 trans/sec
- Python เทียบกับภาษาคอมไพล์: ช้ากว่า C/C++ 5-50 เท่า, ช้ากว่า Go/Rust 5-20 เท่า
CPython JIT เผชิญกับความท้าทายในการใช้งาน
โครงการ Cinder ของ Facebook แสดงถึงแนวทางที่แตกต่างในการปรับปรุง Python หลังจากการพัฒนา 18 เดือน ทีมงานได้ความเร็วเพิ่มขึ้น 5 เท่าใน custom interpreter fork ของพวกเขา อย่างไรก็ตาม เมื่อพวกเขาพยายามรวมการปรับปรุงเหล่านี้กลับเข้าไปใน CPython codebase หลัก ผลการปรับปรุงประสิทธิภาพหายไปอย่างสิ้นเชิง
ความพยายาม CPython JIT ปัจจุบันที่นำโดย Mark Shannon มุ่งเน้นไปที่เทคนิค type specialization และ adaptive optimization แม้จะได้ความเร็วเพิ่มขึ้น 4 เท่าในบางงาน แต่ผลลัพธ์ยังคงไม่สม่ำเสมอในแอปพลิเคชันต่าง ๆ โปรแกรมบางตัวเห็นการปรับปรุงเพียงเล็กน้อย และ JIT ปัจจุบันรองรับเฉพาะสถาปัตยกรรม AMD64 เท่านั้น
Type specialization: เทคนิคการปรับปรุงที่คำสั่งโค้ดถูกปรับแต่งสำหรับประเภทข้อมูลเฉพาะเพื่อปรับปรุงความเร็วในการประมวลผล
ข้อจำกัดของ CPython JIT
- รองรับเฉพาะสถาปัตยกรรม AMD64 เท่านั้น
- ต้องการการฝึกอบรมด้วยการปรับให้เหมาะสมแบบ profile-guided optimization (PGO)
- ผลการปรับปรุงประสิทธิภาพไม่สม่ำเสมอในแอปพลิเคชันต่างๆ
- เป้าหมายเดิมที่ตั้งไว้คือเพิ่มความเร็ว 5 เท่า แต่ลดลงเหลือการปรับปรุงประมาณ 50% ในช่วง 4 ปี
- ความท้าทายในการรวมเข้าด้วยกันเมื่อผสานการปรับให้เหมาะสมกลับเข้าสู่ codebase หลัก
ชุมชนตั้งคำถามเกี่ยวกับทิศทางของ Python
ส่วนสำคัญของชุมชน Python แสดงความหงุดหงิดกับการมุ่งเน้นไปที่การปรับปรุง CPython ขณะที่ PyPy ยังคงถูกใช้งานน้อย แม้จะมีประวัติที่พิสูจน์แล้วของ PyPy และความเท่าเทียมกันของฟีเจอร์กับ Python 3.12 ในปัจจุบัน การยอมรับยังคงจำกัด นักพัฒนาหลายคนยังคงเชื่อผิด ๆ ว่า PyPy รองรับเพียงส่วนย่อยของ Python หรือทำงานได้ไม่ดีกับ C extensions
PyPy เร็วกว่าเฉลี่ย 4 เท่า แต่ชุมชน python 95% เพิกเฉย มันมีความเท่าเทียมกันของฟีเจอร์กับ 3.12 แล้วและไลบรารี pypi ส่วนใหญ่ทำงานได้
ความกังวลเรื่องความเข้ากันได้ที่เคยทำให้ PyPy ประสบปัญหาได้รับการแก้ไขส่วนใหญ่แล้ว PyPy เวอร์ชันใหม่จัดการกับ C extension modules ได้ แม้ว่าอาจทำงานช้ากว่าโค้ด Python บริสุทธิ์เนื่องจาก overhead ของการจำลอง reference counting
สถานะความเข้ากันได้ของ PyPy
- รองรับฟีเจอร์ของ Python 3.12
- เข้ากันได้กับไลบรารีส่วนใหญ่ใน PyPI
- จัดการโมดูลส่วนขยาย C ได้ (แต่มีค่าใช้จ่ายด้านประสิทธิภาพบ้าง)
- ทำงานร่วมกับเฟรมเวิร์กยอดนิยมอย่าง Flask และ Django ได้
- ข้อจำกัดเพียงอย่างเดียว: การเรียกใช้ private CPython API บางตัวที่ไลบรารีบางตัวใช้
อนาคตของประสิทธิภาพ Python
แนวทางของ Python Software Foundation ในการปรับปรุงประสิทธิภาพยังคงมุ่งเน้นไปที่การปรับเปลี่ยน CPython แทนที่จะยอมรับโซลูชันที่มีอยู่แล้วอย่าง PyPy กลยุทธ์นี้ทำให้สมาชิกชุมชนหลายคนงุนงง โดยเฉพาะอย่างยิ่งเมื่อพิจารณาถึงความสำเร็จที่ PyPy แสดงให้เห็นในสภาพแวดล้อมการใช้งานจริง
การตัดสินใจของ Microsoft เมื่อเร็ว ๆ นี้ที่จะยกเลิกทีม Faster CPython ทำให้ภูมิทัศน์ซับซ้อนยิ่งขึ้น การจากไปของทีมแสดงถึงความพ่ายแพ้สำหรับความพยายามในการปรับปรุง CPython และเน้นย้ำถึงความท้าทายในการใช้งาน JIT compilation ใน Python interpreter หลัก
การอภิปรายสะท้อนถึงคำถามที่กว้างขึ้นเกี่ยวกับอนาคตของ Python: ว่าจะดำเนินต่อไปในเส้นทางที่ยากลำบากของการปรับปรุง CPython หรือจะยอมรับการใช้งานทางเลือกที่ส่งมอบการปรับปรุงประสิทธิภาพที่นักพัฒนาต้องการแล้ว เมื่อบทบาทของ Python ในการพัฒนาซอฟต์แวร์ยังคงเติบโต การตัดสินใจนี้จึงมีความสำคัญมากขึ้นสำหรับความสามารถในการแข่งขันระยะยาวของภาษานี้
อ้างอิง: Following up on the Python JIT