ทำไมฉันไม่ควรใช้ PyPy กับ CPython ถ้า PyPy เร็วกว่า 6.3 เท่า?


685

ฉันได้ยินมามากมายเกี่ยวกับโครงการPyPy พวกเขาอ้างว่ามันคือ 6.3 ครั้งเร็วกว่าCPythonล่ามบนเว็บไซต์ของพวกเขา

เมื่อใดก็ตามที่เราพูดถึงภาษาไดนามิกเช่น Python ความเร็วเป็นหนึ่งในปัญหาอันดับต้น ๆ เพื่อแก้ปัญหานี้พวกเขาบอกว่า PyPy เร็วขึ้น 6.3 เท่า

ปัญหาที่สองคือการขนานกันInterpreter Lock (GIL) ที่น่าอับอาย สำหรับเรื่องนี้ PyPy บอกว่ามันสามารถให้ GIL น้อยหลาม

หาก PyPy สามารถแก้ปัญหาความท้าทายที่ยิ่งใหญ่เหล่านี้อะไรคือจุดอ่อนที่ป้องกันการยอมรับในวงกว้าง? นั่นคือจะบอกว่าสิ่งที่ป้องกันไม่ให้คนอย่างผมซึ่งเป็นผู้พัฒนาหลามทั่วไปจากการเปลี่ยนไป PyPy ในขณะนี้ ?


30
ถูกลบล้างความคิดเห็นเพราะส่วนใหญ่เป็นสิ่งที่ควรได้รับคำตอบจากเนื้อหนัง (และในบางกรณี) หรือไม่ควรพูดอะไรเลย แก้ไขด้วยเพื่อแก้ไขข้อกังวลบางประการที่เกิดขึ้นเกี่ยวกับการกระทำของคำถามนี้ โปรดลองตอบโดยใช้ข้อเท็จจริงและสำรองการยืนยันแหล่งที่มาหากเป็นไปได้!
Shog9

3
ฉันใช้ Pypy มามาก มันทำงานได้ดีมาก อย่างไรก็ตามในขณะที่ Pypy นั้นค่อนข้างเร็วกว่าสำหรับภาระงานของ CPU จำนวนมาก แต่จริงๆแล้วก็ช้าลงสำหรับปริมาณงาน I / O- งานหนักที่ฉันเคยขว้างใส่ไป ตัวอย่างเช่นฉันเขียนโปรแกรมสำรองข้อมูลที่ซ้ำกันที่เรียกว่า backshift สำหรับการสำรองข้อมูลครั้งแรกซึ่งมีไฟล์จำนวนมาก pypy นั้นยอดเยี่ยม แต่สำหรับการสำรองข้อมูลที่ตามมาซึ่งส่วนใหญ่เพิ่งอัพเดตการประทับเวลา CPython เร็วขึ้น
dstromberg

คำตอบ:


657

หมายเหตุ: PyPy เป็นผู้ใหญ่มากขึ้นและได้รับการสนับสนุนที่ดีขึ้นกว่าตอนนี้ในปี 2013 เมื่อมีการถามคำถามนี้ หลีกเลี่ยงการสรุปจากข้อมูลที่ล้าสมัย


  1. PyPy เป็นคนอื่นได้อย่างรวดเร็วที่จะกล่าวถึงมีการสนับสนุนสำหรับส่วนขยายผอมบาง C มันมีการรองรับ แต่โดยทั่วไปแล้วจะช้ากว่าความเร็ว Python และแน่นอนที่สุด ดังนั้นโมดูลจำนวนมากจึงต้องการ CPython PyPy ไม่สนับสนุน numpy PyPy สนับสนุน numpyแล้ว ส่วนขยายบางอย่างยังไม่ได้รับการสนับสนุน (Pandas, SciPy ฯลฯ ) ดูที่รายการแพคเกจที่รองรับก่อนทำการเปลี่ยนแปลง
  2. การสนับสนุน Python 3 อยู่ในระหว่างการทดลองใช้งาน เพิ่งมาถึงที่มั่นคง! ตั้งแต่วันที่ 20 มิถุนายน 2014, PyPy3 2.3.1 - Fulcrum ออกมาแล้ว !
  3. PyPy บางครั้งอาจไม่เร็วสำหรับ "สคริปต์" ซึ่งผู้คนจำนวนมากใช้ Python เหล่านี้เป็นโปรแกรมระยะสั้นที่ทำสิ่งที่ง่ายและเล็ก เนื่องจาก PyPy เป็นคอมไพเลอร์ JIT ข้อดีหลักมาจากเวลาที่ยาวนานและประเภทที่เรียบง่าย (เช่นตัวเลข) ตรงไปตรงมาด้วยความเร็วก่อน JIT PyPy จะสวยไม่ดีเมื่อเทียบกับ CPython
  4. ความเฉื่อย การย้ายไปที่ PyPy มักจะต้องมีการปรับแต่งใหม่ซึ่งสำหรับบางคนและองค์กรนั้นทำงานมากเกินไป

นี่คือเหตุผลหลักที่ส่งผลกระทบต่อฉันฉันพูด


14
ยินดีที่คุณพูดถึงการดัดแปลง ตัวอย่างเช่นโฮสต์เว็บของฉันมีตัวเลือกระหว่าง Python 2.4 และ 2.5 และ "ผู้ผลิตซอฟต์แวร์ความบันเทิงรายใหญ่" ที่อยู่ใกล้ฉันกำลังใช้ 2.6 โดยไม่มีแผนที่จะอัพเกรดในไม่ช้า บางครั้งอาจเป็นความพยายามที่สำคัญและมีค่าใช้จ่ายสูงในการค้นหาค่าใช้จ่ายของการแปลง
Mike Housky

19
PyPy คือ "เร็วเท่ากับ C" เป็นเรื่องเกี่ยวกับ C ทั่วไปมากกว่าไลบรารี่ C ที่รับรู้ถึงแคชแบบมัลติเธรดที่ปรับให้เหมาะสมซึ่งใช้สำหรับตัวเลข สำหรับตัวเลข Python ใช้เพื่อข้ามไปรอบ ๆ ตัวชี้ไปยังอาร์เรย์ขนาดใหญ่ ดังนั้น PyPy จึงเป็น "เร็วเท่ากับ C" หมายถึง "พอยน์เตอร์ + ข้อมูลเมตาของคุณถูกย้ายไปเร็วเท่ากับ C" ไม่ใช่เรื่องใหญ่. แล้วทำไมต้องกังวลกับ Python เลย? ไปที่ฟังก์ชั่นลายเซ็นใน cblas และ lapacke
cjordan1

12
@ cjordan1: ฉันไม่เข้าใจสิ่งที่คุณพูด โครงสร้างระดับสูงของ Numpy นั้นมีความหมายอย่างมากnp.sum(M[1:2*n**2:2, :2*n**2] * M[:2*n**2:2, :2*n**2].conjugate(), axis=1)ในภาษา Python และทำให้ Python นั้นเหมาะสมกับชุมชนวิทยาศาสตร์ นอกจากนี้การทำชิ้นส่วนที่ไม่ต้องใช้ความเข้มข้นใน Python และการปอกเปลือกออกไปยัง C สำหรับลูปแบบเร่งรัดขนาดเล็กนั้นเป็นกลยุทธ์ทั่วไปและใช้งานได้
Veedrac

26
@Veedrac นั่นคือสิ่งที่ฉันหมายถึง เช่นเดียวกับใน "ลองดูที่ลายเซ็นของฟังก์ชันใน cblas และ lapacke" เพราะมันยาวและยากที่จะใช้ซึ่งคุณจะเข้าใจได้ทันทีว่าทำไมเราใช้ Python เพื่อข้ามไปรอบ ๆ ตัวชี้และข้อมูลเมตา
cjordan1

5
@ tommy.carstensen นี่ไม่ใช่สถานที่ที่ดีที่จะไปในเชิงลึก แต่ฉันจะลอง 1.นี่เป็นเรื่องจริงมากขึ้นเมื่อฉันเขียนมันมากกว่าตอนนี้ 2. "สคริปต์" เป็น IO-heavy PyPy ของ IO ยังคงช้ากว่า CPython บ่อยครั้งมันช้ากว่ามาก 3. PyPy เคยช้ากว่า CPython ที่จัดการกับสตริง - ตอนนี้มันมักจะดีขึ้นและไม่ค่อยแย่ลง 4. "สคริปต์" จำนวนมากเป็นเพียงรหัสกาว - ทำให้ล่ามเร็วขึ้นจะไม่ปรับปรุง runtimes โดยรวมในกรณีนั้น 5.เวลาอุ่นเครื่องของ PyPy มีขนาดใหญ่กว่า - สคริปต์ที่เรียกใช้งานสั้น ๆ ไม่ค่อยมีการจัดการเพื่อสร้างรหัสร้อนจำนวนมาก
Veedrac

104

ไซต์นั้นไม่ได้อ้างสิทธิ์ PyPy เร็วกว่า CPython 6.3 เท่า อ้าง:

ค่าเฉลี่ยเรขาคณิตของมาตรฐานทั้งหมดคือ 0.16 หรือ 6.3 เท่าเร็วกว่า CPython

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

หากต้องการทำลายสิ่งนั้น:

  • ข้อความที่พวกเขาใช้นั้นใช้กับมาตรฐานที่พวกเขาใช้เท่านั้น มันบอกว่าไม่มีอะไรเกี่ยวกับโปรแกรมของคุณเลย (ยกเว้นว่าโปรแกรมของคุณจะตรงกับมาตรฐานของพวกเขา)

  • คำสั่งนี้เป็นค่าเฉลี่ยของกลุ่มมาตรฐาน ไม่มีการอ้างสิทธิ์ว่าการใช้ PyPy จะปรับปรุง 6.3 ครั้งสำหรับโปรแกรมที่ทดสอบ

  • ไม่มีการเรียกร้องใด ๆ ว่า PyPy จะเรียกใช้โปรแกรมทั้งหมดที่ CPython ทำงานเลยแม้แต่น้อยก็เร็วขึ้น


15
แน่นอนว่าไม่มีการกล่าวอ้างว่า PyPy จะรันรหัส Python ทั้งหมดได้เร็วขึ้น แต่ถ้าคุณใช้แอปพลิเคชั่น Python ล้วนๆฉันสามารถเดิมพันได้ว่าส่วนใหญ่ที่สำคัญจะรันเร็วกว่า (> 3x เท่า) ใน PyPy จากนั้นบน CPython
Robert Zaremba

18
ไม่มีสัญลักษณ์แสดงหัวข้อย่อยสองแห่งแรกของคุณที่เหมาะสม คุณจะบอกได้อย่างไรว่ามาตรฐานนั้นบอกว่า "ไม่มีอะไรเกี่ยวกับโปรแกรมของคุณ" เห็นได้ชัดว่าการวัดประสิทธิภาพไม่ใช่ตัวบ่งชี้ที่สมบูรณ์แบบสำหรับการใช้งานจริงทั้งหมด แต่แน่นอนว่ามันจะมีประโยชน์ในฐานะตัวบ่งชี้ นอกจากนี้ฉันไม่เข้าใจสิ่งที่คุณพบว่าทำให้เข้าใจผิดเกี่ยวกับพวกเขารายงานค่าเฉลี่ยของกลุ่มมาตรฐาน พวกเขาระบุอย่างชัดเจนว่ามันเป็นค่าเฉลี่ย หากโปรแกรมเมอร์ไม่เข้าใจว่าค่าเฉลี่ยคืออะไรพวกเขามีข้อกังวลที่ร้ายแรงกว่าการใช้ภาษา
Sean Geoffrey Pietz

6
@SeanGeoffreyPietz - ฉันไม่ได้อ้างว่าไซต์ของ PyPy นั้นสร้างความเข้าใจผิด แต่อย่างใด - พวกเขาได้แสดงผลลัพธ์อย่างถูกต้อง แต่คำถามดั้งเดิมนั้นทำให้พวกเขาเข้าใจผิดและแสดงให้เห็นว่าผู้เขียนไม่เข้าใจความสำคัญของคำว่า 'เฉลี่ย' เกณฑ์มาตรฐานส่วนบุคคลจำนวนมากไม่เร็วขึ้น 6.3 เท่า และถ้าคุณใช้ค่าเฉลี่ยประเภทอื่นคุณจะได้รับค่าที่แตกต่างดังนั้น "6.3 x เร็ว" ไม่ใช่การสรุปที่เพียงพอของ "ค่าเฉลี่ยเรขาคณิตคือ 6.3 x เร็ว" "กลุ่ม A คือ Z คูณเร็วกว่ากลุ่ม B" นั้นคลุมเครือเกินกว่าจะมีความหมาย
spookylukey

6
-1: @spookylukey คุณดูเหมือนจะแนะนำว่าชุดเบนช์มาร์กนั้นเอนเอียงโดยไม่แสดงหลักฐานเพื่อสนับสนุนการเรียกร้อง คำติชมควรสำรองไว้พร้อมกับหลักฐานเสมอ!
Evgeni Sergeev

5
@EvgeniSergeev - ไม่ฉันหมายถึงว่ามาตรฐานทั้งหมดมีอคติ! ไม่จำเป็นต้องมีเจตนาแน่นอน พื้นที่ของโปรแกรมที่มีประโยชน์ที่เป็นไปได้นั้นมีมากมายและหลากหลายอย่างไม่น่าเชื่อและชุดของการวัดประสิทธิภาพที่เคยวัดประสิทธิภาพของการวัดประสิทธิภาพเหล่านั้น ถามว่า "PyPy เร็วกว่า CPython เร็วแค่ไหน" เหมือนถามว่า "เฟร็ดกว่าโจเร็วแค่ไหน" ซึ่งเป็นสิ่งที่ OP ต้องการรู้
spookylukey

74

เนื่องจาก pypy เข้ากันไม่ได้ 100% ใช้ ram 8 กิ๊กในการคอมไพล์เป็นเป้าหมายเคลื่อนที่และการทดลองอย่างสูงโดยที่ cpython เสถียรเป้าหมายเริ่มต้นสำหรับผู้สร้างโมดูลสำหรับ 2 ทศวรรษ (รวมถึงส่วนขยาย c ที่ไม่ทำงานบน pypy ) และถูกนำไปใช้อย่างกว้างขวางแล้ว

Pypy อาจจะไม่ใช้การอ้างอิง แต่เป็นเครื่องมือที่ดีที่จะมี


2
ตามpypy.org/download.html PyPy ต้องการ RAM 4 GB ในการคอมไพล์ (บนระบบ 64- บิต) ไม่ใช่ 8 และมีตัวเลือกในหน้านั้นให้ทำน้อยกว่า 3 GB หากจำเป็น
knite

4
@ อัศวิน 1: เป็นของใหม่ปี 2558 เอกสารอ่านได้ในอดีต 8 GB 2: ในทางปฏิบัติในปี 2558 คุณยังคงต้องการอย่างน้อย 8 ด้วย 6-7 ฟรี
Tritium21

4
ข้อกำหนดหน่วยความจำในการคอมไพล์นั้นไม่เกี่ยวข้องกันหากคุณใช้บิลด์หรือบิลด์ ในเรื่อง "เป้าหมายที่เคลื่อนไหวและมีการทดลองสูง" คุณสามารถยกตัวอย่างของสิ่งที่แตกหักได้หรือไม่? อีกครั้งหากผู้คนกำลังใช้งานบิลด์รีลีสแทนที่จะสร้างบิลด์หรือซอร์สในตอนกลางคืนพวกเขาไม่มีความคาดหวังที่สมเหตุสมผลเกี่ยวกับการทำงาน
smci

@smci นี่เป็นคำถามโบราณตามข้อมูลโบราณพร้อมคำตอบโบราณ ลองพิจารณาคำถามนี้และคำตอบทุกข้อเพื่อให้เป็นประวัติศาสตร์สำหรับสถานะของ pypy 4 ปีก่อน
Tritium21

1
@ Tritium21: ฉันสนใจเฉพาะคำตอบปัจจุบัน มันคืออะไร? คุณอาจต้องการแก้ไขคำตอบของคุณเพื่อพูดว่า"ณ ปี 2556 การเปรียบเทียบ pypy vs version 2.x ของ Python คือ ... "และถ้าการอ้างสิทธิ์ "6.3x เรขาคณิตเฉลี่ย" ในคำถามนั้นล้าสมัย ( เช่น จาก 4/2017 พวกเขาเรียกร้อง 7.5x แต่ถึงอย่างนั้นก็ขึ้นอยู่กับมาตรฐาน ... ) จากนั้นก็จำเป็นต้องแก้ไขด้วย (หมายเลขรุ่นข้อมูลล่าสุด ฯลฯ ) ฉันคิดว่าชุดมาตรฐานนั้นไม่เกี่ยวข้องกันมาก วันนี้ raytracing ในภาษาสคริปต์บนซีพียู ฉันพบpybenchmarks.org
smci

37

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

สำหรับคำถามแรกฉันคิดว่ามันเป็น Catch-22 กับคำถามแรก: PyPy ได้รับการพัฒนาอย่างรวดเร็วเพื่อปรับปรุงความเร็วและเพิ่มความสามารถในการทำงานร่วมกันกับโค้ดอื่น ๆ สิ่งนี้ทำให้การทดลองมากกว่าทางราชการ

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


17
ฉันไม่คิดว่า C เป็นภาษาที่จะไปได้ทุกที่ในไม่ช้า (ฉันยินดีที่จะบอกว่ามันจะไม่หายไปในชีวิตของเรา) จนกว่าจะมีภาษาอื่นที่จะทำงานที่ใดก็ได้เราจะมี C. (โปรดทราบว่า JVM ถูกเขียนใน C. แม้แต่ java ภาษาที่ "ทำงานได้ทุกที่" ต้องการ C สำหรับความเป็นทุกสิ่ง) มิฉะนั้นฉันก็เห็นด้วยกับโพสต์นี้มากที่สุด ของคะแนน
Tritium21

7
@ Tritium21: ใช่ฉันแค่ทำการตัดต่อที่นั่น ฉันสบายดีกับ C ที่มีอยู่แล้ว แต่ฉันคิดว่าการพึ่งพา Python ใน C เป็นอันตรายอย่างมหาศาลและ PyPy เป็นตัวอย่างที่ดีว่าทำไม: ตอนนี้เรามีโอกาสที่จะได้รับ Python ที่เร็วขึ้น แต่เราเพิ่มขึ้นหลายปี มันจะดีกว่ามากสำหรับ Python ที่จะยืนด้วยสองเท้าของมันเอง มันก็โอเคถ้า Python เขียนด้วยภาษา C แต่ปัญหาคือการมีกลไกส่วนขยายที่กระตุ้นให้คนขยาย Python ด้วยวิธีที่ขึ้นอยู่กับ C.
BrenBarn

4
ดาบคู่คู่ในนั้น - ส่วนหนึ่งของสิ่งที่ทำให้ไพ ธ อนได้รับความนิยมคือความสามารถในการขยายแอพพลิเคชั่นอื่น ๆ และขยายโดยแอพพลิเคชั่นอื่น ๆ ถ้าคุณพามันไปฉันไม่คิดว่าเราจะพูดถึงงูหลาม
Tritium21

10
@BrenBarn มันเป็นความเขลาที่สุดที่จะอ้างว่าการพึ่งพา Python ใน C เป็นอันตราย หากไม่มี C-API ของ Python ไลบรารีที่ทรงพลังที่สุดและการทำงานร่วมกันที่ยอดเยี่ยมที่ Python ได้รับในช่วงวัยรุ่นช่วงปลายปี (ปลาย 90s) รวมถึงระบบนิเวศเชิงตัวเลข / วิทยาศาสตร์และอินเตอร์เฟส GUI ทั้งหมดจะไม่สามารถทำได้ มองไปรอบ ๆ เพื่อให้ได้มุมมองเกี่ยวกับการใช้งานของจักรวาลทั้งหมดของ Python ก่อนที่จะทำการแถลงอย่างครอบคลุม
Peter Wang

4
@PeterWang ห้องสมุดทั้งหมดนั้นสามารถเขียนด้วย Python ได้ แต่จะไม่เร็วเท่าที่ควร สิ่งที่ BrenBarn กำลังพูดคือตอนนี้เรามีโอกาสที่จะทำให้ python เร็วพอที่จะสามารถเขียน libs ในไพ ธ อนได้ แต่เราปฏิเสธที่จะใช้โอกาสนั้นเพราะมันหมายถึงการสูญเสียความสามารถในการใช้ไลบรารี C ฉันเชื่อว่านั่นคือสิ่งที่เขาหมายถึงเป็นอันตรายไม่ใช่ว่าการมีอยู่ของห้องสมุด C นั้นเป็นสิ่งที่ไม่ดี แต่วิธีเดียวที่จะสร้างห้องสมุดที่รวดเร็วได้คือการใช้ C.
vikki

14

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

นักพัฒนา BDFL และ CPython เป็นกลุ่มอัจฉริยะที่น่าทึ่งและมีการจัดการเพื่อช่วยให้ CPython ทำงานได้อย่างยอดเยี่ยมในสถานการณ์ดังกล่าว นี่เป็นปลั๊กบล็อกไร้ยางอาย: http://www.hydrogen18.com/blog/unpickling-buffers.html ฉันใช้ Stackless ซึ่งได้มาจาก CPython และเก็บอินเทอร์เฟซโมดูล C แบบเต็ม ฉันไม่พบข้อได้เปรียบใด ๆ จากการใช้ PyPy ในกรณีนี้


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

1
Julian เป็นเรื่องที่น่าสังเกตว่ากลุ่มคน PyPy ได้ให้ความสำคัญกับความพยายามอย่างมากในการปรับปรุง runtimes ของชุดมาตรฐานนั้นมาหลายปีแล้ว ในระดับหนึ่งดูเหมือนว่าพวกเขา "overfitting" การเพิ่มประสิทธิภาพของชุดมาตรฐานนี้และจากประสบการณ์ของฉันนอกเหนือจากการคำนวณเชิงตัวเลขอย่างหมดจด (ซึ่งดีกว่าใน Fortran หรือ C99 ต่อไป) ฉันไม่เคยได้รับ PyPy อีกต่อไป เร็วกว่า ~ 2X เร็วกว่า CPython
Alex Rubinsteyn

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

1
ฉันตรวจสอบบล็อกของคุณ ในผลลัพธ์ของคุณคู่ไพ ธ อนของ (ดอง, StringIO) แสดงว่า pypy เร็วกว่า cpython ~ 6.8x ฉันคิดว่านี่เป็นผลลัพธ์ที่มีประโยชน์ ในบทสรุปของคุณคุณชี้ให้เห็น (อย่างถูกต้อง) ว่ารหัส pypy (ซึ่งเป็นงูหลามธรรมดา!) ช้ากว่ารหัส C (cPickle, cStringIO) ไม่ใช่รหัส cpython
Caleb Hattingh

1
@gsnedders ฉันได้เสนอเกณฑ์มาตรฐานตาม rinohtypeในหลาย โอกาส พวกเขายังไม่ได้เพิ่มลงในห้องชุด
Brecht Machiels

12

ถาม: ถ้า PyPy สามารถแก้ไขความท้าทายที่ยิ่งใหญ่เหล่านี้ (ความเร็วปริมาณการใช้หน่วยความจำขนาน) เมื่อเปรียบเทียบกับ CPython จุดอ่อนของมันคืออะไรที่ขัดขวางการยอมรับในวงกว้าง

A: ครั้งแรกที่มีหลักฐานเพียงเล็กน้อยว่าทีม PyPy สามารถแก้ปัญหาความเร็วในทั่วไป หลักฐานระยะยาวแสดงให้เห็นว่า PyPy รันรหัส Python บางรหัสช้ากว่า CPython และข้อเสียเปรียบนี้ดูเหมือนว่าจะหยั่งรากลึกใน PyPy

ประการที่สองรุ่นปัจจุบันของ PyPy ใช้หน่วยความจำมากกว่า CPython ในชุดเคสที่ค่อนข้างใหญ่ ดังนั้น PyPy จึงไม่สามารถแก้ปัญหาการใช้หน่วยความจำได้

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

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


ถาม: ทำไมฉันไม่สามารถแทนที่ CPython ด้วย PyPy ได้ในตอนนี้?

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


คำตอบนี้ไม่ได้อ้างอิงมาตรฐานใด ๆ หรือให้การอ้างอิง
qwr

7

CPython มีการอ้างอิงการนับและการรวบรวมขยะ PyPy มีการรวบรวมขยะเท่านั้น

ดังนั้นวัตถุมีแนวโน้มที่จะถูกลบก่อนหน้านี้และ__del__ถูกเรียกในวิธีที่คาดเดาได้มากขึ้นใน CPython ซอฟต์แวร์บางตัวอาศัยลักษณะการทำงานนี้ดังนั้นพวกเขาจึงไม่พร้อมสำหรับการโยกย้ายไปยัง PyPy

ซอฟต์แวร์อื่นบางตัวทำงานร่วมกับทั้งคู่ แต่ใช้หน่วยความจำน้อยกว่ากับ CPython เนื่องจากวัตถุที่ไม่ได้ใช้จะว่างก่อนหน้านี้ (ฉันไม่มีการวัดใด ๆ เพื่อระบุความสำคัญของสิ่งนี้และรายละเอียดการใช้งานอื่น ๆ ที่มีผลต่อการใช้หน่วยความจำ)


17
ควรเน้นว่าการพึ่งพา__del__การถูกเรียก แต่เนิ่นๆหรือในทุกกรณีนั้นผิดแม้ใน CPython ตามที่คุณวางไว้มันมักจะใช้งานได้และบางคนก็คิดว่ามันรับประกัน หากสิ่งใดก็ตามที่อ้างอิงวัตถุถูกติดตามในรอบการอ้างอิง (ซึ่งค่อนข้างง่าย - คุณรู้หรือไม่ว่าการตรวจสอบข้อยกเว้นปัจจุบันในรูปแบบที่ไม่ได้วางแผนไว้จะสร้างวงจรอ้างอิงขึ้นมา) การสรุปจะล่าช้าไปเรื่อย ๆ จนกระทั่งรอบถัดไป GC (ซึ่งอาจไม่เคย ) หากวัตถุนั้นเป็นส่วนหนึ่งของวงจรอ้างอิง__del__จะไม่ถูกเรียกเลย (ก่อนหน้า Python 3.4)

3
ค่าโสหุ้ยต่อวัตถุสูงกว่าใน CPython ซึ่งสำคัญมากเมื่อคุณเริ่มสร้างวัตถุจำนวนมาก ฉันเชื่อว่า PyPy ทำหน้าที่เทียบเท่าสล็อตโดยปริยายสำหรับสิ่งหนึ่ง

4

สำหรับโครงการจำนวนมากจริง ๆ แล้วมีความแตกต่าง 0% ระหว่าง pythons ที่แตกต่างกันในแง่ของความเร็ว นั่นคือสิ่งที่ถูกครอบงำโดยเวลาทางวิศวกรรมและที่งูเหลือมทุกคนมีจำนวนห้องสมุดเท่ากัน


1
หากโครงการของคุณนั้นง่ายมากเห็นได้ชัดว่ามันไม่สำคัญ แต่อาจกล่าวได้ว่าการใช้ภาษาใด ๆ : ถ้าคุณทำทั้งหมดคือการรวมฟังก์ชั่นของห้องสมุดอื่น ๆ ผ่านทาง ABIs ที่ค่อนข้างมีประสิทธิภาพมันก็ไม่เกี่ยวข้องทั้งหมด

1
มันไม่มีอะไรเกี่ยวข้องกับเรื่องง่าย ๆ ในเวลาวิศวกรรมห่วงข้อเสนอแนะเป็นสิ่งสำคัญ บางครั้งสำคัญกว่าเวลาวิ่ง
เตฟาน Eggermont

1
คุณกำลังพูดอย่างคลุมเครือ (เวลาวิศวกรรมโดยไม่มีการอ้างอิงถึงสิ่งที่ถูกออกแบบสิ่งที่เป็นข้อ จำกัด ฯลฯ วงข้อเสนอแนะโดยไม่มีการอ้างอิงถึงสิ่งที่ถูกป้อนกลับใคร ฯลฯ ) ดังนั้นฉันจะไป เพื่อแสดงความเคารพต่อการสนทนามากกว่าการแลกเปลี่ยนข้อมูลอ้างอิงที่เป็นความลับ

ไม่มีอะไรคลุมเครือที่นี่ ดูที่ OODA loop หรือ PDCA
เตฟาน Eggermont

3
@ ผู้ใช้ดีโครงการใด ๆ ที่ใช้เวลาหนึ่งเดือนในการเขียนและใช้เวลาหนึ่งนาทีในการทำงานจะมีความเร็วโดยรวม 0.0% (1 เดือน + 1 นาทีเทียบกับ 1 เดือน) จากการใช้ PyPy แม้ว่า PyPy จะเร็วกว่าพันเท่าก็ตาม สเตฟานไม่ได้อ้างว่าโครงการทั้งหมดจะมีความเร็วเพิ่มขึ้น 0%
gmatht

4

เพื่อทำให้ง่ายนี้: PyPy ให้ความเร็วที่ CPython ขาดไป แต่เสียสละความเข้ากันได้ อย่างไรก็ตามคนส่วนใหญ่เลือก Python สำหรับความยืดหยุ่นและคุณสมบัติ "รวมแบตเตอรี่" (ความเข้ากันได้สูง) ไม่ใช่ความเร็ว (ยังต้องการมากกว่า)


16
"รวมแบตเตอรี่" หมายถึงห้องสมุดมาตรฐานขนาดใหญ่ AFAIK
tshepang

4

ฉันพบตัวอย่างที่ PyPy ช้ากว่า Python แต่: เฉพาะบน Windows

C:\Users\User>python -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 294 msec per loop

C:\Users\User>pypy -m timeit -n10 -s"from sympy import isprime" "isprime(2**521-1);isprime(2**1279-1)"
10 loops, best of 3: 1.33 sec per loop

ดังนั้นถ้าคุณคิดถึง PyPy ให้ลืม Windows บน Linux คุณสามารถเร่งความเร็วได้อย่างยอดเยี่ยม ตัวอย่าง (แสดงช่วงเวลาทั้งหมดตั้งแต่ 1 ถึง 1,000,000):

from sympy import sieve
primes = list(sieve.primerange(1, 10**6))

สิ่งนี้จะทำงานเร็วขึ้น 10 เท่า (!) ใน PyPy มากกว่าบน Python แต่ไม่ใช่บนหน้าต่าง มันเร็วแค่ 3x เท่านั้น


! ที่น่าสนใจ การเปรียบเทียบและตัวเลขบางอย่างจะดีมาก
ben26941

1

PyPy สนับสนุน Python 3 มาระยะหนึ่งแล้ว แต่จากการอ้างอิงของHackerNoon โดย Anthony Shaw ตั้งแต่วันที่ 2 เมษายน 2018 PyPy3 ยังช้ากว่า PyPy (Python 2) หลายเท่า

สำหรับการคำนวณทางวิทยาศาสตร์จำนวนมากโดยเฉพาะอย่างยิ่งการคำนวณเมทริกซ์จำนวนเป็นทางเลือกที่ดีกว่า (ดูคำถามที่พบบ่อย: ฉันควรติดตั้ง numpy หรือ numpypy หรือไม่ )

Pypy ไม่รองรับ gmpy2 คุณสามารถใช้gmpy_cffi แทนได้ แต่ฉันไม่ได้ทดสอบความเร็วของมันและโครงการมีการเปิดตัวหนึ่งครั้งในปี 2014

สำหรับปัญหา Project Euler ฉันใช้ PyPy บ่อยครั้งและการคำนวณเชิงตัวเลขอย่างง่ายมักfrom __future__ import divisionจะเพียงพอสำหรับวัตถุประสงค์ของฉัน แต่การสนับสนุน Python 3 ยังคงใช้งานได้ในปี 2018 โดยวางเดิมพันที่ดีที่สุดของคุณบน Linux 64 บิต Windows PyPy3.5 v6.0 ล่าสุดเมื่อเดือนธันวาคม 2561 อยู่ในช่วงเบต้า


0

รองรับ Python เวอร์ชั่น

ในการอ้างอิงZen of Python :

จำนวนการอ่าน

ยกตัวอย่างเช่นงูหลาม 3.7 แนะนำdataclassesและ Python 3.8 แนะนำfstring =

อาจมีคุณสมบัติอื่น ๆ ใน Python 3.7 และ Python 3.8 ซึ่งมีความสำคัญต่อคุณมากกว่า ประเด็นคือ PyPy ไม่รองรับ Python 3.7 หรือ Python 3.8 ในขณะนี้

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