ทำไม Python จึงไม่ได้รับการปรับให้เหมาะกับการใช้งาน Javascript สมัยใหม่?


11

การใช้งานจาวาสคริปต์สมัยใหม่เช่น V8 (Chrome), SpiderMonkey (Firefox) และ Chakra (IE / Edge) ล้วนมีการรวบรวม JIT และการเพิ่มประสิทธิภาพอื่น ๆ จำนวนมากเพื่อปรับปรุงประสิทธิภาพ

ทำไมหลามจึงไม่มีสิ่งเหล่านี้

ฉันดู PyPy และ IronPython ซึ่งทั้งคู่อ้างว่าความเร็วเพิ่มขึ้น PyPy ฉันไม่เข้าใจว่าการใช้งาน Python ในภาษาไพ ธ อนเป็นภาษาที่ตีความจะเร็วกว่าการนำไปใช้อ้างอิงใน C. IronPython แนวคิดเดียวกัน แต่ฉันไม่เห็นว่า. NET Framework จะเพิ่มความเร็วอย่างไร


2
IronPython เหมือนกับภาษา. NET อื่น ๆ ซึ่งรวบรวมไว้ใน "Common Intermediate Language" ของ Microsoft ซึ่งมีการใช้งานคอมไพเลอร์ JIT ที่โตเต็มที่
Doc Brown

2
ภาษาการเขียนโปรแกรมเป็นข้อมูลจำเพาะ (เขียนในเอกสารบางอย่าง) ไม่ใช่ซอฟต์แวร์ การใช้งานภาษาโปรแกรมเท่านั้นคือซอฟต์แวร์ (และสามารถเป็นคอมไพเลอร์หรือล่าม)
Basile Starynkevitch

1
@BasileStarynkevitch: ฉันไม่ได้รับสิ่งที่คุณพยายามที่จะบอกเราด้วยความคิดเห็นนี้ OP กำลังถามอย่างชัดเจนเกี่ยวกับ CPython, PyPy และ IronPython ซึ่งเป็นการใช้งานของ Python ที่เฉพาะเจาะจง
Doc Brown

1
@DocBrown ดูเหมือนว่าจุดที่เกี่ยวข้องเพื่อนำขึ้นมาในวรรคสุดท้ายของคำถามซึ่งแสดงความเข้าใจผิดเมื่อมันเรียกเฉพาะ Python ภาษาตีความ
8bittree

คำตอบ:


19

ทำไมหลามจึงไม่มีสิ่งเหล่านี้

ฉันไม่แน่ใจว่าทำไมคุณคิดว่าไม่มีการใช้งาน Python ที่ใส่ใจกับประสิทธิภาพ PyPy , IronPythonและJythonเป็นการนำ Python มาใช้ในอุตสาหกรรมที่มีความแข็งแกร่งและพร้อมสำหรับการผลิตซึ่งให้ความสำคัญกับประสิทธิภาพ Pystonเป็นการใช้งานในการพัฒนาที่ถูกสร้างขึ้นโดยเฉพาะสำหรับประสิทธิภาพ Unladen SwallowและPsycoเป็นโครงการเพื่อปรับปรุงประสิทธิภาพของ Python

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

คำตอบนี้เป็นตัวอย่างที่ดีของความคิดทั่วไปของชุมชน Python: แทนที่จะแก้ไขปัญหาด้านประสิทธิภาพพวกเขาเพียงต้องการเขียนโค้ดที่ไม่ใช่ Python

ฉันดู PyPy และ IronPython ซึ่งทั้งคู่อ้างว่าความเร็วเพิ่มขึ้น PyPy ฉันไม่เข้าใจว่าการใช้งาน Python ในภาษาไพ ธ อนเป็นภาษาที่ตีความจะเร็วกว่าการนำไปอ้างอิงใน C ได้อย่างไร

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

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

ประการที่สามไม่มีสิ่งเช่น "ภาษาตีความ" ภาษาคือชุดของกฎและข้อ จำกัด ทางคณิตศาสตร์ มันเป็นสเปค กระดาษแผ่นหนึ่ง ภาษาไม่ได้แปลหรือแปลความหมาย ภาษาเพียงคือ การรวบรวมและการตีความเป็นลักษณะของการใช้ภาษาแม่นยำมากขึ้นผู้แปลหรือล่าม (duh!) ไม่ใช่ภาษา ทุกภาษาสามารถใช้งานได้โดยคอมไพเลอร์ ทุกภาษาสามารถใช้งานได้โดยล่าม คุณสามารถสร้างคอมไพเลอร์โดยอัตโนมัติจากล่ามและล่ามจากคอมไพเลอร์

แต่ทั้งหมดนี้ไม่สำคัญจริงๆเพราะ PyPy ไม่ได้เขียนใน Python มันเขียนไว้ในRPython RPython ประกอบด้วยสองส่วนคือภาษาการเขียนโปรแกรม RPythonและเฟรมเวิร์ก RPython

ภาษาการเขียนโปรแกรม RPython ไม่ใช่ Python มันเป็นภาษาการเขียนโปรแกรมที่แตกต่างกัน RPython เป็นภาษาการเขียนโปรแกรมแบบสแตติกในระดับเดียวกับ abstraction เหมือนกับ Java โดยมีประสิทธิภาพการทำงานแบบเดียวกับ C. RPython เป็นชุดย่อยทางไวยากรณ์และความหมายของ Python ซึ่งหมายความว่าทุกโปรแกรม RPython เป็นโปรแกรม Python ที่ถูกต้องและสามารถ ถูกเรียกใช้โดยการใช้ Python (แม้ว่าโดยทั่วไปจะมีขนาดของคำสั่งช้ากว่า แต่ก็ยังมีประโยชน์สำหรับการดีบั๊กเนื่องจากคุณสามารถเข้าถึงเครื่องมือ Python ทั้งหมดและการตีความเริ่มทันทีในขณะที่การรวบรวมภาษามักใช้เวลาประมาณ 5-10 นาที ) แต่การสนทนาไม่เป็นความจริง

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

มีการนำภาษามาใช้มากมายบนแพลตฟอร์ม RPythonไม่ใช่แค่ PyPy

IronPython แนวคิดเดียวกัน แต่ฉันไม่เห็นว่า. NET Framework จะเพิ่มความเร็วได้อย่างไร

การใช้งานส่วนใหญ่ของ ISO CLI เช่นตัวแปร. NET ต่างๆของ Microsoft หรือ Mono มีการรวบรวมขยะที่ซับซ้อนตัวเพิ่มประสิทธิภาพและคอมไพเลอร์ เช่นเดียวกับการใช้ Jython และ Java

IronPython เป็นคอมไพเลอร์มันรวบรวมไพ ธ อนซอร์สโค้ดกับต้นไม้ DLR (DLR คือ Dynamic Language Runtime) ซึ่งจะถูกคอมไพล์แล้วต่อไปยังรหัสไบต์ CIL ซึ่งโดยทั่วไปแล้วจะคอมไพล์อีกครั้งเพื่อรหัสเครื่องท้องถิ่น


6

การใช้งานจาวาสคริปต์สมัยใหม่เช่น V8 (Chrome), SpiderMonkey (Firefox) และ Chakra (IE / Edge) ล้วนมีการรวบรวม JIT และการเพิ่มประสิทธิภาพอื่น ๆ จำนวนมากเพื่อปรับปรุงประสิทธิภาพ

ทำไมหลามจึงไม่มีสิ่งเหล่านี้

JavaScript ถูกรวมอยู่ในเว็บเบราว์เซอร์และซอฟต์แวร์จำนวนมากในวันนี้ได้รับการออกแบบให้ทำงานในเว็บเบราว์เซอร์ สิ่งนี้ทำให้ประสิทธิภาพ JavaScript สำคัญมากทำให้ บริษัท อย่าง Google, Apple และ Microsoft ลงทุนทรัพยากรจำนวนมากเพื่อทำให้ JavaScript ทำงานได้เร็วขึ้น หากกระแสเงินถูกเปลี่ยนเส้นทางไปยัง Python มันจะเร็วพอ ๆ กัน

PyPy ฉันไม่เข้าใจว่าการใช้งาน Python ในภาษาไพ ธ อนเป็นภาษาที่ตีความจะเร็วกว่าการนำไปอ้างอิงใน C ได้อย่างไร

แนวคิดคือเมื่อโค้ดเป็น JIT-ed แล้วจะไม่ "ตีความ" อีกต่อไป PyPI ทำงานโดยการแปลงรหัส Python เป็นรหัสเครื่อง (เช่นรหัสเครื่อง x86_64) ซึ่งจะถูกดำเนินการโดยตรงบนโปรเซสเซอร์


3
ที่เกี่ยวข้องโดยเฉพาะอย่างยิ่งคือในเว็บเบราว์เซอร์ไม่มีทางเลือกอื่นสำหรับ JavaScript (หรืออย่างน้อยก็ยังไม่มีให้บริการในเบราว์เซอร์หลัก ๆ ทั้งหมด) หากคุณต้องการประสิทธิภาพที่รวดเร็วในเว็บเบราว์เซอร์คุณต้องมีการใช้งาน JavaScript ที่รวดเร็ว ในขณะที่บนแพลตฟอร์มที่ใช้ Python คุณสามารถย้ายไปใช้ภาษาอื่นที่อาจมีการใช้งานที่ดีกว่า
8bittree

-3

ถ้าคุณจัดโครงสร้างโค้ดไพ ธ อนลงในโมดูลด้วยการเริ่มต้นระดับง่าย ๆ เป็นไฟล์ไพ ธ อนหลัก (โดยมีโค้ดน้อยมาก) ไพ ธ อนจะรวบรวมส่วนที่เหลือทั้งหมดของรหัสของคุณลงในรหัสไบต์ของเครื่องโดยอิสระ ไฟล์. pyc ที่คุณเห็นในโครงสร้างไดเรกทอรีของคุณ สิ่งนี้จะช่วยลดเวลาในการโหลดและการตีความหลังจากการเรียกใช้ครั้งแรก

หากคุณเริ่มต้นสคริปต์ด้วยแฟล็ก -O หรือ -OO หรือตั้งค่า PYTHONOPTIMIZE เป็นค่าที่มากกว่า 0 ไฟล์. pyo จะถูกสร้างขึ้นซึ่งจะได้รับการปรับแต่งเพิ่มเติม

หากคุณต้องการการเพิ่มประสิทธิภาพขั้นสูงสำหรับฟังก์ชั่นบางอย่างคุณสามารถเขียนมันใน C, C ++, FORTRAN หรือ GO แล้วใช้มันจากภายในไพ ธ อน


คุณจะรวมส่วนขยายที่ไม่ใช่ C เข้ากับ Python ได้อย่างไร ฉันรู้เฉพาะส่วนขยาย C สำหรับ Cython เท่านั้น

1
@Bey: โดยพื้นฐานแล้วอะไรก็ตามในไลบรารีที่ใช้ร่วมกัน (.dll หรือ. so) สามารถเรียกได้จาก python หากคุณรู้ว่าลายเซ็นของฟังก์ชั่นเหล่านี้สามารถกำหนดค่าได้ด้วยตนเองสร้างโดยเครื่องมือเช่นสวิงหรือแม้แต่สร้างจากเอกสาร doxygen stackoverflow.com/questions/5811949/…มีประโยชน์เช่นเดียวกับblog.heroku.com/see_python_see_python_go_go_go_python_go
Steve Barnes
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.