8 คะแนน โดย GN⁺ 2024-01-10 | 1 ความคิดเห็น | แชร์ทาง WhatsApp

เพิ่มคอมไพเลอร์ JIT ใน Python 3.13

  • Brandt Bucher นักพัฒนาหลักของ CPython ได้ส่งพูลรีเควสต์เพื่อเพิ่มคอมไพเลอร์ JIT เข้าไปในสาขา Python 3.13
  • การเปลี่ยนแปลงนี้จะเป็นหนึ่งในการเปลี่ยนแปลงครั้งใหญ่ที่สุดของอินเทอร์พรีเตอร์ CPython นับตั้งแต่อินเทอร์พรีเตอร์แบบ specialized adaptive ที่ถูกเพิ่มเข้ามาใน Python 3.11

JIT คืออะไร?

  • JIT (Just in Time) compilation หมายถึงการออกแบบที่ทำการคอมไพล์เมื่อโค้ดถูกรันเป็นครั้งแรก
  • JIT compiler คือคอมไพเลอร์ที่สร้าง machine code ซึ่งแตกต่างจาก AOT (Ahead of Time) compiler
  • โค้ด Python จะถูกคอมไพล์เป็นไบต์โค้ดก่อน โดยไบต์โค้ดนี้ไม่มีความหมายโดยตรงต่อ CPU และจะถูกรันผ่านลูปอินเทอร์พรีเตอร์ไบต์โค้ดแบบพิเศษ

copy-and-patch JIT คืออะไร?

  • copy-and-patch JIT เป็นแนวคิดที่ถูกเสนอในปี 2021 โดยออกแบบให้เป็นอัลกอริทึมที่รวดเร็วสำหรับรันไทม์ของภาษาแบบไดนามิก
  • copy-and-patch JIT คือแนวคิดในการคัดลอกคำสั่งสำหรับแต่ละ instruction และเติมค่าอาร์กิวเมนต์ของไบต์โค้ดลงไป (patch)

ข้อดีและข้อเสียของ copy-and-patch JIT

  • JIT compiler แบบ "เต็มรูปแบบ" จะคอมไพล์ไบต์โค้ดระดับสูงไปเป็นคำสั่งระดับต่ำของ intermediate language (IL) ขณะที่ copy-and-patch JIT จะคอมไพล์จากไบต์โค้ดไปเป็น machine code โดยใช้ชุดของเทมเพลต
  • copy-and-patch JIT ไม่จำเป็นต้องรันสถาปัตยกรรม JIT compiler ที่ซับซ้อนภายใน Python runtime และเพียงแค่ต้องติดตั้งเครื่องมือ LLVM JIT บนเครื่องที่ใช้คอมไพล์ CPython จากซอร์ส

JIT นี้ทำงานอย่างไร?

  • มีการขยาย API ที่เพิ่มใหม่ใน Python 3.13 เพื่อให้สามารถค้นพบ optimizer แบบเสียบปลั๊กได้ในขณะรัน
  • JIT ใหม่นี้เป็น optimizer แบบเลือกใช้สำหรับสถาปัตยกรรมใหม่นี้
  • เมื่อต้องคอมไพล์ CPython จากซอร์ส หากระบุแฟลก --enable-experimental-jit ระบบจะสร้างเทมเพลต machine code สำหรับไบต์โค้ดของ Python

JIT นี้เร็วขึ้นหรือไม่?

  • เบนช์มาร์กระยะแรกแสดงให้เห็นว่าประสิทธิภาพดีขึ้นประมาณ 2-9%
  • JIT นี้เป็นรากฐานสำคัญของชุดการเพิ่มประสิทธิภาพที่จะช่วยยกระดับสมรรถนะของ Python ได้อย่างมาก

ความเห็นของ GN⁺

  • คอมไพเลอร์ JIT ที่ถูกเพิ่มเข้ามาใน Python 3.13 เป็นการเปลี่ยนแปลงสำคัญที่ช่วยเพิ่มความเร็วในการรัน Python โดยเฉพาะสามารถเพิ่มประสิทธิภาพของงานที่ทำซ้ำได้
  • copy-and-patch JIT นำเสนอแนวทางที่ล้ำสมัยในการเพิ่มประสิทธิภาพ โดยไม่จำเป็นต้องผสานสถาปัตยกรรม JIT ที่ซับซ้อนเข้าไปใน Python runtime ของผู้ใช้
  • เทคโนโลยีนี้จะก่อให้เกิดการถกเถียงที่น่าสนใจในชุมชน Python และคาดว่าจะเปิดประตูบานใหม่ให้กับการเพิ่มประสิทธิภาพของ Python

1 ความคิดเห็น

 
GN⁺ 2024-01-10
ความคิดเห็นจาก Hacker News
  • การปรับปรุงประสิทธิภาพ 2-9% ระหว่างเวอร์ชันซอฟต์แวร์เป็นเรื่องที่น่าสนใจ แม้ว่าการปรับปรุงเล็กน้อยแบบนี้บางครั้งจะถูกมองว่าน่าผิดหวัง แต่ก็ชอบที่มันสะสมอย่างต่อเนื่องจนทำให้แต่ละเวอร์ชันเร็วกว่าเวอร์ชันก่อนหน้า
  • เป็นเรื่องดีที่เทคนิค 'copy and patch' ของ Haoran Xu และ Fredrik Kjolstad กำลังได้รับความสนใจ รู้จักเรื่องนี้ครั้งแรกผ่านบล็อกโพสต์ของโปรเจ็กต์รีเมค LuaJIT ของ Xu รู้สึกว่าวิธีนำเทคนิคเดิมกลับมาใช้ใหม่เพื่อสร้างสิ่งใหม่ขึ้นมานั้นชาญฉลาดมาก แนะนำบล็อกโพสต์ดังกล่าวสำหรับคนที่อยากเรียนรู้เรื่องการพัฒนาภาษา และ Xu ยังบอกด้วยว่าเหตุผลที่อัปเดตบล็อกช้าเป็นเพราะมีการรื้อทำส่วน backend ใหม่
  • Brandt ได้นำเสนอหัวข้อนี้ในงานสปรินต์นักพัฒนาแกนหลักของ CPython เมื่อปีที่แล้ว
  • แม้จะมีงานของ PyPy, Jython, GraalPy และ IronPython อยู่แล้ว การเพิ่ม JIT เข้าไปใน CPython ก็ยังถือเป็นพัฒนาการสำคัญสำหรับระบบนิเวศของ Python โดยเฉพาะวิวัฒนาการหลังจากเวอร์ชัน 3.13 ที่น่าจับตา
  • ใช้ Python กับทุกอย่างนอกเหนือจากการพัฒนาเว็บ ดังนั้นถ้าประสิทธิภาพดีขึ้นก็เป็นเรื่องที่ดีมาก ระบบนิเวศของ Python ได้ขยับจากคำขอแบบไร้สถานะอย่าง CGI หรือ mod_php ไปสู่โปรเซสที่รันระยะยาวแล้ว นั่นหมายความว่าเวลาปรับแก้เว็บแอปพลิเคชันบนเครื่องโลคัลอาจต้องรีสตาร์ตทุกครั้ง และนักพัฒนาบางคนก็ใช้วิธีรีสตาร์ตแอปอัตโนมัติเมื่อบันทึกไฟล์
  • จำได้ว่าเดิมที CPython ตั้งใจจะรักษาโค้ดเบสให้เรียบง่ายมาก และปล่อยให้การปรับแต่งประสิทธิภาพเป็นหน้าที่ของอิมพลีเมนเทชันอื่น
  • ในบทความแนะนำ JIT แบบ 'copy and patch' ราวกับเป็นของใหม่ แต่จำได้ว่า QuickBASIC บน DOS ก็ใช้แนวทางคล้ายกัน QuickBASIC แพตช์บล็อกแอสเซมบลีแม่แบบในหน่วยความจำและสร้างโค้ดแอสเซมบลีที่แย่มาก
  • ความคืบหน้าเรื่องประสิทธิภาพของ Python ในช่วง 2 ปีที่ผ่านมาน่าทึ่งมาก ทีมแกนหลักจริงจังกับการเพิ่มประสิทธิภาพในฐานะเป้าหมายสำคัญ และทำการปรับปรุงที่เห็นผลชัดเจน
  • อยากให้มีการลงทุนด้านเงินทุนกับ PyPy แต่สำหรับโปรแกรมขนาดเล็ก PyPy ยังมีเวลาเริ่มต้นที่ไม่ค่อยดีนักจึงไม่เห็นข้อได้เปรียบมากนัก และในโปรแกรมขนาดใหญ่ก็อาจเกิดปัญหาความเข้ากันได้ที่ซับซ้อน หาก JIT ของ CPython เชื่อถือได้มากกว่าหรือมีเวลาเริ่มต้นที่เร็วกว่า ก็อาจช่วยแก้ปัญหาบางส่วนได้
  • ข้อความ PR ในรีโพซิทอรี GitHub ของ Python ที่ล้อเลียน 'คืนก่อนวันคริสต์มาส' นั้นมีไหวพริบดี