ทำไม PyPy ไม่รวมอยู่ใน Python มาตรฐาน?


165

ฉันกำลังดูPyPyและฉันก็แค่สงสัยว่าทำไมมันไม่ได้ถูกนำไปใช้ในการกระจาย Python จะไม่เหมือนกับการรวบรวม JIT และ footprint หน่วยความจำที่ต่ำกว่าอย่างมากปรับปรุงความเร็วของรหัส Python ทั้งหมดหรือไม่

ในระยะสั้นสิ่งที่เป็นข้อเสียเปรียบหลักของ PyPy ที่ทำให้มันยังคงเป็นโครงการที่แยกจากกัน?


4
นอกจากนี้ pypy ยังไม่ได้รับการสนับสนุนสำหรับ numpy เลย morepypy.blogspot.ch/2012/09/numpy-on-pypy-status-update.html
rthiago

และการสนับสนุนที่มีจำนวนมากทำให้เกิดรอยขีดข่วนบนพื้นผิวของแอปพลิเคชันการคำนวณทางวิทยาศาสตร์ที่จำเป็นก่อนที่จะเปลี่ยนเป็น นี่คือความคิดตรงประเด็นจากผู้เขียน numpy ดั้งเดิม: technicaldiscovery.blogspot.com/2011/10/…
Stuart Berg

3
ฉันคิดว่าคำตอบและความคิดเห็นเหล่านี้ล้าสมัย
Marlon Abeykoon

คำตอบ:


249

PyPy ไม่ใช่ส่วนหนึ่งของ CPython ดังนั้นจึงไม่สามารถผสานเข้ากับ CPython ได้โดยตรง

ในทางทฤษฎีชุมชน Python สามารถนำ PyPy มาใช้ได้ในระดับสากล PyPy สามารถทำการใช้งานอ้างอิงได้และ CPython อาจถูกยกเลิก อย่างไรก็ตาม PyPy มีจุดอ่อนของตัวเอง:

  • CPython นั้นง่ายต่อการรวมเข้ากับโมดูล Python ที่เขียนด้วย C ซึ่งเป็นวิธีที่แอพพลิเคชั่นของ Python จัดการกับงานที่ต้องใช้ CPU มาก (ดูตัวอย่างโครงการ SciPy)
  • ขั้นตอนการคอมไพล์ PyPy JIT นั้นใช้เวลาของ CPU เท่านั้น - เพียงแค่ทำการรันโค้ดที่คอมไพล์ซ้ำ ๆ ซึ่งหมายความว่าเวลาเริ่มต้นอาจสูงกว่าและดังนั้น PyPy จึงไม่จำเป็นต้องมีประสิทธิภาพในการรันโค้ดกาวหรือสคริปต์ที่ไม่สำคัญ
  • พฤติกรรม PyPy และ CPython ไม่เหมือนกันทุกประการโดยเฉพาะอย่างยิ่งเมื่อพูดถึง "รายละเอียดการใช้งาน" (พฤติกรรมที่ไม่ได้ระบุโดยภาษา แต่ยังคงมีความสำคัญในระดับปฏิบัติ)
  • CPython ทำงานบนสถาปัตยกรรมมากกว่า PyPy และได้รับการดัดแปลงให้ทำงานในสถาปัตยกรรมแบบฝังได้สำเร็จในรูปแบบที่อาจเป็นไปไม่ได้สำหรับ PyPy
  • รูปแบบการนับการอ้างอิงของ CPython สำหรับการจัดการหน่วยความจำอาจมีผลกระทบต่อประสิทธิภาพที่คาดการณ์ได้มากกว่าระบบ GC ต่างๆของ PyPy ถึงแม้ว่านี่จะไม่เป็นความจริงสำหรับกลยุทธ์ "GC บริสุทธิ์" ทั้งหมด
  • PyPy ยังไม่รองรับ Python 3.x อย่างเต็มที่แม้ว่าจะเป็นรายการงานที่ใช้งานอยู่

PyPy เป็นโครงการที่ยอดเยี่ยม แต่ความเร็วของรันไทม์สำหรับงานที่ใช้ CPU มากไม่ใช่ทุกอย่างและในหลาย ๆ แอปพลิเคชันมันเป็นเรื่องที่น่ากังวลน้อยที่สุด ยกตัวอย่างเช่น Django สามารถทำงานบน PyPy ได้และทำให้การเทมเพลทได้เร็วขึ้น แต่โปรแกรมควบคุมฐานข้อมูลของ CPython นั้นเร็วกว่า PyPy ในที่สุดการดำเนินการใดที่มีประสิทธิภาพมากขึ้นขึ้นอยู่กับจุดที่คอขวดในแอปพลิเคชันที่ระบุอยู่

อีกตัวอย่างหนึ่ง: คุณคิดว่า PyPy นั้นยอดเยี่ยมสำหรับเกม แต่กลยุทธ์ GC ส่วนใหญ่เช่นที่ใช้ใน PyPy ทำให้เกิดปัญหาที่เห็นได้ชัด สำหรับ CPython ส่วนใหญ่ของเกมที่ใช้ CPU มากจะถูกโหลดไปยังไลบรารี PyGame ซึ่ง PyPy ไม่สามารถใช้ประโยชน์ได้เนื่องจาก PyGame ถูกนำไปใช้เป็นส่วนขยาย C เป็นหลัก (แต่ดูที่: pygame-cffi) ฉันยังคิดว่า PyPy อาจเป็นแพลตฟอร์มที่ยอดเยี่ยมสำหรับเกม แต่ฉันไม่เคยเห็นมันใช้มาก่อน

PyPy และ CPython มีวิธีการที่แตกต่างกันอย่างสิ้นเชิงสำหรับคำถามการออกแบบขั้นพื้นฐานและทำการแลกเปลี่ยนที่แตกต่างกันดังนั้นจึงไม่มีคำถามที่ดีกว่าคำถามอื่น ๆ ในทุกกรณี


4
ไม่เป็นความจริงที่ PyPy ไม่เหมาะสำหรับการเรียกใช้สคริปต์ เวลาเริ่มต้นของมันค่อนข้างเร็วเหมือนกับ CPython และความเร็วในการตีความนั้นใกล้เคียงกัน
ลูเชีย

6
เป็นที่น่าสังเกตว่า PyPy ตอนนี้มาพร้อมกับ GC ที่เพิ่มขึ้นและอาจเหมาะกว่าสำหรับเกมตามมา
porgarmingduod

63

ประการแรกมันเข้ากันไม่ได้กับ 100%กับ Python 2.x และรองรับเฉพาะเบื้องต้นสำหรับ 3.x เท่านั้น

มันไม่ใช่สิ่งที่สามารถผสานได้ - การใช้ Python ที่จัดทำโดย PyPy นั้นสร้างขึ้นโดยใช้เฟรมเวิร์กที่สร้างขึ้นซึ่งเยี่ยมยอดมาก มันจะต้องมีการทดแทนที่สมบูรณ์

มีความแตกต่างที่ชัดเจนระหว่าง PyPy และ CPython ซึ่งเป็นเรื่องใหญ่ที่สนับสนุนโมดูลส่วนขยาย - ซึ่งถ้าคุณต้องการไปไกลกว่าไลบรารีมาตรฐานเป็นเรื่องใหญ่

นอกจากนี้ยังเป็นที่น่าสังเกตว่า PyPy ไม่ได้เร็วขึ้นในระดับสากล


54

ดูวิดีโอนี้โดยกุยรถตู้ซัม เขาพูดถึงคำถามเดียวกันกับที่คุณถามเมื่อ 12 นาที 33 วินาที

ไฮไลท์:

  • ขาดความเข้ากันได้กับ Python 3
  • ขาดการสนับสนุนการขยาย
  • ไม่เหมาะสมเช่นรหัสกาว
  • ความเร็วไม่ใช่ทุกอย่าง

ท้ายที่สุดเขาเป็นคนตัดสินใจ ...


3
+1 สำหรับลิงก์พร้อมลิงก์โดยตรงไปยังส่วนที่เกี่ยวข้องของวิดีโอ! +1 ด้วยเช่นกันสำหรับการสำรวจความคิดเห็นอย่างไม่เป็นทางการของ Guido van Rossum อย่างเฮฮา "มีคนกี่คนที่ใช้ PyPy ในการผลิตหรือไม่ ... ไม่มีมือ? ไอแล้วฉันคิดว่ายังมีความหวัง
Trevor Boyd Smith

15

เหตุผลหนึ่งอาจเป็นเพราะไซต์PyPyปัจจุบันทำงานบนสถาปัตยกรรม Intel x86 แบบ 32- บิตและ 64- บิตเท่านั้นขณะที่ CPython ทำงานบนแพลตฟอร์มอื่นเช่นกัน อาจเป็นเพราะการปรับปรุงความเร็วเฉพาะแพลตฟอร์มใน PyPy ในขณะที่ความเร็วเป็นสิ่งที่ดีผู้คนมักต้องการให้การใช้ภาษาเป็น "แพลตฟอร์มที่เป็นอิสระ" มากที่สุด


6
โปรดทราบว่าแบ็กเอนด์ ARM เกือบจะอยู่ที่นั่นและPowerPC แบ็กเอนด์คือ WIP โปรดทราบด้วยว่านี่หมายถึงคอมไพเลอร์ของ JIT เท่านั้นและการย้าย JIT ไปยังสถาปัตยกรรมใหม่เพียงต้องการใช้ตัวสร้างโค้ดสำหรับ IR ที่ค่อนข้างเรียบง่ายและระดับต่ำไม่มีอะไรเพิ่มเติม

1
ในปี 2018 PyPy ทำงานบนสถาปัตยกรรมจำนวนมากขึ้น x86 (32/64 บิตบน Linunx, Windows, MacOS และ BSDs) แต่ยังบน Linux ฮาร์ดแวร์ ARM รุ่นใหม่ (ARMv6 หรือ ARMv7 กับ VFPv3) ขนาดใหญ่และเล็ก ตัวแปรของ PPC64 และ s390x
Frédéric Grosshans

7

ฉันแนะนำให้ดูประเด็นสำคัญนี้โดยDavid Beazleyเพื่อดูข้อมูลเชิงลึกเพิ่มเติม มันตอบคำถามของคุณโดยให้ความกระจ่างเกี่ยวกับธรรมชาติและความซับซ้อนของ PyPy


6

นอกเหนือจากทุกสิ่งที่ถูกกล่าวถึงที่นี่ PyPy ยังไม่แข็งเท่ากับ CPython ในแง่ของบั๊ก ด้วย SymPy เราพบข้อบกพร่องประมาณหนึ่งโหลใน PyPy ในช่วงสองสามปีที่ผ่านมาทั้งในรุ่นที่วางจำหน่ายและในตอนกลางคืน

ในทางกลับกันเราพบข้อผิดพลาดเพียงหนึ่งเดียวใน CPython และนั่นเป็นการนำเสนอก่อนวางจำหน่าย

นอกจากนี้อย่าลดการขาดการสนับสนุน Python 3 ไม่มีใครในชุมชน Python ที่สำคัญแม้แต่จะสนใจ Python 2 อีกต่อไป พวกเขากำลังทำงานกับสิ่งที่ยิ่งใหญ่ต่อไปใน Python 3.4 ซึ่งจะเป็นรุ่นที่ห้าที่สำคัญของ Python 3 พวก PyPy ยังไม่ได้รับหนึ่งในนั้น ดังนั้นพวกเขาจึงต้องรีบทำก่อนที่พวกเขาจะได้เป็นคู่แข่ง

อย่าเข้าใจฉันผิด PyPy ยอดเยี่ยม แต่ก็ยังห่างไกลจากการเป็นดีกว่า CPython ในหลาย ๆ วิธีที่สำคัญมาก

และถ้าคุณใช้ SymPy ใน PyPy คุณจะไม่เห็นหน่วยความจำขนาดเล็กลง (หรือเร่งความเร็วด้วย) ดูhttps://bitbucket.org/pypy/pypy/issues/1447/


2
ตั้งแต่ปีพ. ศ. 2561 ฉันสามารถยืนยันได้ว่าฉันได้เห็นลำดับการเร่งความเร็วขนาดใหญ่ในการใช้งานแบบต่างๆ
Frédéric Grosshans

1
@ FrédéricGrosshansน่าสนใจ ฉันจะต้องลองเปรียบเทียบมันอีกครั้ง
asmeurer
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.