Python เร็วและเบากว่า C ++ หรือไม่? [ปิด]


92

ฉันคิดเสมอว่าข้อดีของ Python คือความสามารถในการอ่านโค้ดและความเร็วในการพัฒนา แต่การใช้เวลาและหน่วยความจำไม่ดีเท่า C ++

สถิติเหล่านี้ทำให้ฉันประทับใจอย่างมาก

ประสบการณ์ของคุณบอกอะไรคุณเกี่ยวกับเวลา Python เทียบกับ C ++ และการใช้หน่วยความจำ


18
ดังนั้น Pyhton ส่วนใหญ่จะช้ากว่าและใช้ RAM มากกว่า แต่แหล่งที่มามีขนาดเล็กกว่า ปัญหาคืออะไรกันแน่?
nuriaion

2
ฉันเดาว่าฉันตีความผลลัพธ์ผิด
Alex

6
สิ่งที่น่าสนใจจริงๆคือการทดสอบ C ++ ยัง 'ดีกว่า' มากกว่าการทดสอบ C!
gbjbaanb

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

1
ลิงก์ตายแล้ว
Arn

คำตอบ:


240

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

ประสบการณ์ของฉันกับ Python แสดงแนวโน้มที่ชัดเจนเช่นเดียวกันว่า Python อยู่ในลำดับที่ช้ากว่า C ++ ระหว่าง 10 ถึง 100 เท่าเมื่อทำการกระทืบจำนวนที่ร้ายแรง มีสาเหตุหลายประการสาเหตุหลัก ๆ คือ a) Python ถูกแปลความหมายในขณะที่ C ++ ถูกคอมไพล์ b) Python ไม่มีพื้นฐานทุกอย่างรวมถึงประเภท builtin (int, float ฯลฯ ) เป็นวัตถุ c) รายการ Python สามารถเก็บวัตถุประเภทต่างๆได้ดังนั้นแต่ละรายการจะต้องจัดเก็บข้อมูลเพิ่มเติมเกี่ยวกับประเภทของมัน สิ่งเหล่านี้ขัดขวางทั้งรันไทม์และการใช้หน่วยความจำอย่างรุนแรง

นี่ไม่ใช่เหตุผลที่จะละเลย Python ซอฟต์แวร์จำนวนมากไม่ต้องการเวลาหรือหน่วยความจำมากนักแม้ว่าจะมีปัจจัยความช้า 100 เท่าก็ตาม ต้นทุนในการพัฒนาคือจุดที่ Python ชนะด้วยรูปแบบที่เรียบง่ายและรัดกุม การปรับปรุงต้นทุนการพัฒนานี้มักจะมากกว่าต้นทุนของทรัพยากร CPU และหน่วยความจำเพิ่มเติม อย่างไรก็ตามเมื่อไม่เป็นเช่นนั้น C ++ ก็จะชนะ


111
นอกจากนี้คนที่พูดถึง Python ที่ทำงานช้าเนื่องจากการกระทืบจำนวนมากยังไม่ได้ใช้โมดูล Numpy และ Scipy Python กำลังก้าวไปสู่การใช้คอมพิวเตอร์ทางวิทยาศาสตร์ในปัจจุบัน แน่นอนว่าความเร็วมาจากการใช้โมดูลที่เขียนใน C หรือไลบรารีที่เขียนด้วย Fortran แต่นั่นคือความสวยงามของภาษาสคริปต์ในความคิดของฉัน
Justin Peel

3
ฉันมั่นใจในสิ่งที่คุณพูดและนี่คือลิงค์สำหรับพิสูจน์มัน: blog.dhananjaynene.com/2008/07/…
ucefkh

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

ถ้าคุณพูดถึง cpython .. ก็ใช่ แต่ในกรณีส่วนใหญ่ pypy เร็วมาก (เทียบได้กับ java ความเร็ว 1/3 ของ java ฉันเดา) ส่วนย่อยของ python จะเร็วเกือบเท่า c ++ (ดูที่โรงหนัง)
Quonux

1
@JustinPeel ฉันถามว่าเป็นเรื่องจริงหรือเปล่า แม้เมื่อมีการใช้อย่างกว้างขวางของnumpyและscipyที่มีขนาดใหญ่ฐานรหัสมีแนวโน้มที่จะมีจำนวนมากของรหัสในหลามบริสุทธิ์ทำสิ่งที่ช้ากว่าpython C++สคริปต์ python เข้าใกล้ความเร็วของC++สคริปต์เมื่อเปอร์เซ็นต์ของCโค้ดไปถึง100ณ จุดนั้นมันไม่ใช่สคริปต์ python อีกต่อไป python กำลังเริ่มต้นอย่างแน่นอน แต่ไม่ใช่เพราะมันเร็วเท่าC++- เพราะใช้งานง่ายกว่า
dbliss

131

การใช้งาน Python ที่ช้าที่สุด (> 100x) ทั้งหมดในการยิงคือปฏิบัติการทางวิทยาศาสตร์ที่ต้องใช้จำนวน GFlop / s สูง คุณไม่ควรใช้ python สำหรับสิ่งเหล่านั้น วิธีที่ถูกต้องในการใช้ python คือการนำเข้าโมดูลที่ทำการคำนวณเหล่านั้นจากนั้นไปพักผ่อนกับครอบครัวในช่วงบ่าย นั่นคือวิธี pythonic :)


3
ปัจจุบันมีคอมไพเลอร์ Python-to-C ++หลายตัวดังนั้น Python จึงเร็วเท่ากับ C ++ ในบางกรณี
Anderson Green

26

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

คำถามของคุณคืออะไร?


ฉันรู้สึกสับสนกับผลลัพธ์ของเกณฑ์มาตรฐาน ปรากฎว่าฉันตีความผิด
Alex

16

ขนาดของแหล่งที่มาไม่ใช่สิ่งที่สมเหตุสมผลในการวัด ตัวอย่างเช่นเชลล์สคริปต์ต่อไปนี้:

cat foobar

สั้นกว่า Python หรือ C ++ ที่เทียบเท่ากันมาก


35
และง่ายกว่ามากในการดูแลรักษาเวอร์ชัน Python หรือ C ++ ที่ยาวขึ้นด้วย ฉันยืนยันว่าขนาดซอร์สโค้ดมีความสำคัญและสำหรับงานง่ายๆบางอย่างสคริปต์เปลือกสั้นนั้นดี
ล็อต

ฉันเชื่อด้วยว่าขนาดซอร์สโค้ดมีความสำคัญมากและสำหรับบางงาน Bash เป็นเครื่องมือที่เหมาะสมสำหรับงานนี้ ดูตัวอย่างที่ดีในการเปรียบเทียบ bash script กับ python ที่นี่: innolitics.com/articles/programming-languages/… (คุณต้องเลื่อนลงเล็กน้อย) ฉันคิดว่ามันเป็นตัวอย่างที่ซับซ้อนกว่าcat footerเล็กน้อย
jdg

7

นอกจากนี้: Psyco เทียบกับ C ++

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


2
กล่าวอีกนัยหนึ่ง - เนื่องจากสิ่งที่เป็นจำนวนมากนั้นช้ากว่ามากจึงเขียนใน C ++ และเรียกมันจาก Python :-)
igouy

1
หากคุณจะใช้ไลบรารีใน python เพื่อให้เร็วขึ้นคุณอาจใช้ไลบรารีการกระทืบตัวเลขใน c ++ ด้วยวิธีนี้คุณจะรักษาความยืดหยุ่นของ c ++ โดยไม่ต้องเขียนโค้ดมากมาย :)
SuperSim135

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

6

ปัญหาคือคุณมีสองภาษาที่แตกต่างกันซึ่งสามารถแก้ปัญหาสองปัญหาที่แตกต่างกัน ... มันเหมือนกับการเปรียบเทียบ C ++ กับแอสเซมเบลอร์

Python มีไว้สำหรับการพัฒนาแอปพลิเคชันอย่างรวดเร็วและเมื่อประสิทธิภาพเป็นเรื่องเล็กน้อย

C ++ ไม่ได้มีไว้สำหรับการพัฒนาแอปพลิเคชันอย่างรวดเร็วและสืบทอดความเร็วจาก C - สำหรับการเขียนโปรแกรมระดับต่ำ


3

เป็นปัญหาเดียวกันกับภาษาโปรแกรมที่มีการจัดการและใช้งานง่ายเช่นเคย - มันช้า (และบางครั้งก็กินหน่วยความจำ)

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


ไลบรารีเหล่านั้นเขียนขึ้นสำหรับ Python หรือ C หรือ Java แล้วทำไมไม่ใช้ภาษาไดนามิกเพื่อรวมเข้าด้วยกัน?
aoeu256

2

ฉันคิดว่าสถิติเหล่านี้แสดงให้เห็นว่า Python ช้ากว่ามากและใช้หน่วยความจำมากกว่าสำหรับเกณฑ์มาตรฐานเหล่านั้นคุณแน่ใจหรือไม่ว่าคุณอ่านถูกต้องแล้ว?

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


แน่นอน. เมื่อประสิทธิภาพเป็นปัญหาสิ่งที่ python ทำได้ดีคือการรวมโมดูลภายนอกที่มีประสิทธิภาพสูงเข้าด้วยกันหรือการสร้างต้นแบบระบบแล้วปล่อยให้คอขวด (โดยปกติจะอยู่ลึกเข้าไปในวงใน) จะถูกเขียนใหม่เป็นโมดูล C เป็นต้น
xan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.