Python กับ Cpython


447

มีอะไรยุ่งยากเกี่ยวกับ Python และ CPython (Jython, IronPython)ฉันไม่เข้าใจ:

python.orgระบุว่า CPython คือ:

การใช้งาน "ดั้งเดิม" ของ Python (ชื่อเล่น CPython)

คำถาม Stack Overflow อีกฉบับระบุว่า:

CPython เป็นล่ามรหัสไบต์เริ่มต้นของ Python ซึ่งเขียนเป็น C

จริงๆแล้วฉันไม่เข้าใจความหมายของคำอธิบายทั้งสอง แต่สิ่งที่ฉันคิดคือถ้าฉันใช้ CPython หมายความว่าเมื่อฉันเรียกใช้ตัวอย่างรหัสไพ ธ อนมันจะรวบรวมเป็นภาษา C และดำเนินการราวกับว่าเป็น C รหัส

ดังนั้นอะไรคือ CPython และแตกต่างกันอย่างไรเมื่อเปรียบเทียบกับ python และฉันควรใช้ CPython เหนือ Python และข้อดีของมันคืออะไร?


คำตอบ:


689

CPython คืออะไร

CPython เป็นการใช้Python ดั้งเดิม นี่เป็นการใช้งานที่คุณดาวน์โหลดจาก Python.org คนเรียกว่า CPython จะแตกต่างจากคนอื่น ๆ ภายหลังการใช้งานงูหลามและเพื่อแยกความแตกต่างการใช้งานของเครื่องยนต์ภาษาจากหลามการเขียนโปรแกรมภาษาตัวเอง

ส่วนหลังเป็นที่มาของความสับสน คุณต้องแยก Python-the-language ออกจากสิ่งที่รันโค้ด Python

CPython เกิดขึ้นที่จะนำมาใช้ใน C. นั่นเป็นเพียงรายละเอียดการใช้งานจริง ๆ CPython รวบรวมรหัส Python ของคุณเป็น bytecode (โปร่งใส) และตีความ bytecode นั้นในลูปการประเมินผล

CPython เป็นคนแรกที่ใช้คุณสมบัติใหม่; Python-the-language development ใช้ CPython เป็นพื้นฐาน การใช้งานอื่น ๆ ติดตาม

แล้ว Jython เป็นต้นล่ะ?

Jython , IronPythonและPyPyเป็นการนำภาษาอื่นมาใช้ในการเขียนโปรแกรมภาษาไพ ธ อน สิ่งเหล่านี้ถูกนำไปใช้ใน Java, C # และ RPython (ส่วนย่อยของ Python) ตามลำดับ Jython รวบรวมรหัส Python ของคุณเป็นJava bytecode ดังนั้นรหัส Python ของคุณจึงสามารถเรียกใช้บน JVM ได้ IronPython ช่วยให้คุณเรียกงูหลามบนไมโครซอฟท์ CLR และ PyPy ที่มีการใช้งานใน (ส่วนย่อยของ) Python ช่วยให้คุณเรียกใช้รหัส Python ได้เร็วกว่า CPython ซึ่งควรทำให้คุณคิดถูก :-)

รวบรวมเป็น C จริงๆ

ดังนั้น CPython จึงไม่แปลรหัส Python ของคุณเป็น C ด้วยตัวเอง แต่จะรันลูปล่ามแทน มีเป็นโครงการที่ไม่แปลรหัสหลาม-ish ไปที่ C และที่เรียกว่าCython Cython เพิ่มส่วนขยายบางอย่างในภาษา Python และช่วยให้คุณสามารถคอมไพล์โค้ดของคุณไปยังส่วนขยาย C โค้ดที่เสียบเข้ากับล่าม CPython


93
ฉันคิดว่ามันคุ้มค่าที่จะกล่าวถึงว่าในทางทฤษฎีแล้วสคริปต์ไพ ธ อนนั้นสามารถรันได้โดยใช้แอพพลิเคชั่นใด ๆ และผลลัพธ์ของการรันสคริปต์ควรจะเหมือนกัน
Douglas Mendizábal

3
ตามข้อเท็จจริงและขึ้นอยู่กับโครงการที่คุณกำลังดำเนินการอยู่อาจเป็นความคิดที่ดีที่จะทดสอบและจัดทำรหัส Python ของคุณในการใช้งานหลายอย่าง ก่อนหน้านี้เคยทำงานกับโปรเจ็กต์ Java + Jython คุณสามารถพบกับความประหลาดใจได้มากมายเนื่องจาก devs ยังไม่ได้ทดสอบ libs ที่เพียงพอบนแพลตฟอร์มนี้
rahmu

9
การพูดว่า "PyPy เร็วกว่า CPython" เป็นอันตรายเล็กน้อยที่ฉันจะพูด มีคำตอบที่ดีมากสำหรับคำถามนี้อย่างแม่นยำที่นี่: stackoverflow.com/questions/18946662/…
Max Leske

ตื่นเต้นกับ IronPython ... จนกระทั่งฉันเห็นว่ารองรับ Python 2.x เท่านั้น
Sean Anderson

@SeanAnderson: เหมือนกันกับ Jython (จนถึงปี 2015 มีการเปิดตัวอย่างเป็นทางการเพียง 2.5 รุ่นทำให้เก้าปีล้าสมัยในที่สุดพวกเขาก็ปล่อย 2.7 ออกมาในปี 2558 แต่ยังไม่มีวี่แววของรุ่น 3.x)
ShadowRanger

90

คุณต้องแยกความแตกต่างระหว่างภาษาและการใช้งาน Python เป็นภาษา

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

Python เป็นภาษา CPython เป็นการใช้งาน Python ใน C. Jython เป็นการใช้งานใน Java และอื่น ๆ

วิธีสรุป: คุณใช้ CPython อยู่แล้ว (ถ้าคุณดาวน์โหลดจากที่นี่ )


2
คุณควรอ่านโพสต์ของ Martijn Pieters "CPython ไม่ได้แปลรหัส Python ของคุณเป็น C ด้วยตัวเอง แต่จะรัน interpreter loop แทนมีโครงการที่แปลรหัส Python-ish เป็น C และที่เรียกว่า Cython"
Raymond Chenon

2
เหตุใดจึงมีการสร้างความประทับใจอย่างมากมายเกี่ยวกับ Cpython เช่น: เราไม่ได้ยิน Cc ++ หรือ CJava หรือแม้แต่ CSwift หรือว่าฉันขาดอะไรไป?
Suhaib

3
@Suhaib: พวกเขาทำในโลก Java คนมี HotSpot, OpenJDK, IBM J9 JDK, Azul พวกเขามักจะมีความแม่นยำมากขึ้นเช่นคุณไม่เห็น "ติดตั้ง Java" แต่ "ติดตั้ง Java 8 JDK ที่เข้ากันได้เช่น Oracle JDK 8" ในโลก JavaScript คุณมี node.js, V8 ฯลฯ คุณ "ติดตั้ง node.js" ไม่ใช่ "ติดตั้ง JavaScript" ใช่ไหม แต่ในโลกหลามมันค่อนข้างธรรมดาที่จะพูดว่า "ติดตั้ง Python 3.6" และทำแล้วอ้างถึงสเป็คภาษาไม่ใช่รันไทม์เฉพาะ
Hendy Irawan

37

แม้ว่าฉันจะมีปัญหาเดียวกันกับการทำความเข้าใจว่า CPython, JPython, IronPython, PyPy แตกต่างกันอย่างไร

ดังนั้นฉันยินดีที่จะล้างสามสิ่งก่อนที่จะเริ่มอธิบาย:

  1. Python : มันเป็นภาษามันมีเพียงรัฐ / อธิบายถึงวิธีการถ่ายทอด / แสดงตัวเองเพื่อล่าม (โปรแกรมที่ยอมรับรหัสหลามของคุณ)
  2. การดำเนินงาน : มันคือทั้งหมดที่เกี่ยวกับวิธีการล่ามถูกเขียนขึ้นโดยเฉพาะในสิ่งที่ภาษาและสิ่งที่มันจบลงด้วยการทำ
  3. Bytecode : มันเป็นรหัสที่ประมวลผลโดยโปรแกรมซึ่งโดยปกติจะเรียกว่าเครื่องเสมือนแทนที่จะใช้เครื่องคอมพิวเตอร์ "ของจริง" ตัวประมวลผลฮาร์ดแวร์

CPython เป็นการใช้งานซึ่งเขียนด้วยภาษา C มันจบลงด้วยการผลิต bytecode (ชุดคำสั่งตามสแต็ก - เครื่องจักร) ซึ่งเป็น Python ที่เฉพาะเจาะจงจากนั้นเรียกใช้งานมัน เหตุผลในการแปลงรหัส Python เป็น bytecode นั้นเป็นเพราะง่ายต่อการใช้ล่ามหากดูเหมือนว่าคำแนะนำเครื่อง แต่ก็ไม่จำเป็นที่จะต้องสร้าง bytecode บางตัวก่อนที่จะทำการประมวลผลของรหัส Python (แต่ CPython จะสร้างขึ้นมา)

หากคุณต้องการดูรหัสไบต์ของ CPython คุณก็สามารถทำได้ นี่คือวิธีที่คุณสามารถ:

>>> def f(x, y):                # line 1
...    print("Hello")           # line 2
...    if x:                    # line 3
...       y += x                # line 4
...    print(x, y)              # line 5
...    return x+y               # line 6
...                             # line 7
>>> import dis                  # line 8
>>> dis.dis(f)                  # line 9
  2           0 LOAD_GLOBAL              0 (print)
              2 LOAD_CONST               1 ('Hello')
              4 CALL_FUNCTION            1
              6 POP_TOP

  3           8 LOAD_FAST                0 (x)
             10 POP_JUMP_IF_FALSE       20

  4          12 LOAD_FAST                1 (y)
             14 LOAD_FAST                0 (x)
             16 INPLACE_ADD
             18 STORE_FAST               1 (y)

  5     >>   20 LOAD_GLOBAL              0 (print)
             22 LOAD_FAST                0 (x)
             24 LOAD_FAST                1 (y)
             26 CALL_FUNCTION            2
             28 POP_TOP

  6          30 LOAD_FAST                0 (x)
             32 LOAD_FAST                1 (y)
             34 BINARY_ADD
36 RETURN_VALUE

ตอนนี้เรามาดูโค้ดด้านบนกัน บรรทัดที่ 1 ถึง 6 เป็นนิยามฟังก์ชัน ในบรรทัดที่ 8 เรานำเข้าโมดูล 'dis' ซึ่งสามารถใช้เพื่อดู Python bytecode ระดับกลาง (หรือคุณสามารถพูดถอดชิ้นส่วนสำหรับ Python bytecode) ที่สร้างโดย CPython (interpreter)

หมายเหตุ : ฉันได้ลิงค์ไปยังรหัสนี้จาก #python IRC channel: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

จากนั้นมี Jython ซึ่งเขียนด้วยภาษาจาวาและสร้างโค้ด Java byte ขึ้นมา โค้ด Java byte รันบน Java Runtime Environment ซึ่งเป็นการปรับใช้ Java Virtual Machine (JVM) หากนี่สับสนแล้วฉันสงสัยว่าคุณไม่มีเงื่อนงำว่า Java ทำงานอย่างไร ในแง่คนธรรมดาโค้ด Java (ภาษาไม่ใช่คอมไพเลอร์) ถูกใช้โดยคอมไพเลอร์ Java และส่งออกไฟล์ (ซึ่งคือโค้ด Java byte) ที่สามารถรันได้โดยใช้ JRE เท่านั้น สิ่งนี้ถูกทำเพื่อที่ว่าเมื่อโค้ด Java ถูกคอมไพล์จึงสามารถถูกพอร์ตไปยังเครื่องอื่นในรูปแบบโค้ดไบต์ Java ซึ่งสามารถรันได้โดย JRE เท่านั้น หากสิ่งนี้ยังคงสับสนอยู่คุณอาจต้องการดูสิ่งนี้หน้าเว็บ

ที่นี่คุณอาจถามว่าไบต์เทคโทนของ CPython นั้นพกพาได้เหมือนกับ Jython หรือไม่ฉันไม่สงสัย bytecode ผลิตในการดำเนิน CPython เป็นที่เฉพาะเจาะจงกับล่ามว่าสำหรับการทำให้มันง่ายสำหรับการดำเนินการต่อไปของรหัส (ผมยังสงสัยว่าเช่นการผลิต bytecode กลางเพียงเพื่อความสะดวกของการประมวลผลจะทำในล่ามอื่น ๆ อีกมากมาย)

ดังนั้นใน Jython เมื่อคุณรวบรวมรหัส Python ของคุณคุณจะจบลงด้วยรหัส Java byte ซึ่งสามารถทำงานบน JVM

ในทำนองเดียวกัน IronPython (เขียนด้วยภาษา C #) จะรวบรวมรหัส Python ของคุณเป็น Common Language Runtime (CLR) ซึ่งเป็นเทคโนโลยีที่คล้ายคลึงกันเมื่อเทียบกับ JVM ที่พัฒนาโดย Microsoft


3
ขอบคุณสำหรับคำอธิบายรายละเอียด !! ซึ่งหมายความว่า CPython ดูแลการแปลงรหัส Python เป็น Byte Code และตีความรหัสไบต์เป็นรหัสเครื่องด้วยหรือไม่ ใน nut shell CPython เป็นคอมไพเลอร์ (สำหรับ Python ถึง Byte Code) และ Python Virtual Machine (สำหรับ Byte code ถึง Machine code)? เมื่อเปรียบเทียบกับ. Net จะมี C # Compiler เพื่อแปลง C # เป็น MSIL และ CLR เพื่อแปลงจาก MSIL เป็นรหัสเครื่อง
rahulaga_dev

30

นี้บทความอย่างทั่วถึงอธิบายความแตกต่างระหว่างการใช้งานที่แตกต่างกันของงูใหญ่ เช่นเดียวกับบทความที่วางไว้:

สิ่งแรกที่ต้องตระหนักคือ 'Python' เป็นส่วนต่อประสาน มีข้อกำหนดว่า Python ควรทำอย่างไรและควรทำอย่างไร (เช่นเดียวกับส่วนต่อประสานใด ๆ ) และมีการใช้งานหลายอย่าง (เช่นเดียวกับอินเทอร์เฟซใด ๆ )

สิ่งที่สองที่ต้องตระหนักคือ 'ตีความ' และ 'รวบรวม' เป็นคุณสมบัติของการใช้งานไม่ใช่ส่วนต่อประสาน


20

Python เป็นภาษา: ชุดของกฎที่สามารถใช้ในการเขียนโปรแกรม ภาษานี้มีการนำไปใช้หลายอย่าง

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

CPython เป็นการใช้งานดั้งเดิมเขียนเป็นภาษา C (ส่วน "C" ใน "CPython" หมายถึงภาษาที่ใช้ในการเขียน Python interpreter เอง)

Jython เป็นภาษาเดียวกัน (Python) แต่มีการใช้งานโดยใช้ Java

ล่าม IronPython เขียนด้วยภาษา C #

นอกจากนี้ยังมี PyPy - ตัวแปล Python เขียนด้วย Python เลือกของคุณ :)


8

implementationหมายถึงภาษาที่ใช้ในการนำ Python มาใช้และไม่ใช่วิธีที่จะใช้งาน Python Code ข้อดีของการใช้ CPython คือความพร้อมใช้งานของ C Run-time และการรวมเข้ากับ C / C ++ ได้อย่างง่ายดาย

ดังนั้น CPython Cถูกนำมาใช้อย่างชาญฉลาดใช้ มีส้อมอื่น ๆ สำหรับการใช้งานดั้งเดิมซึ่งเปิดใช้งาน Python เพื่อจาวาขอบแบบจาวา (JYthon) หรือ. NET Runtime (IronPython)

ความพร้อมใช้งานของไลบรารีอาจแตกต่างกันไปเช่นCtypes ไม่พร้อมใช้งานใน Jythonดังนั้นไลบรารีใด ๆ ที่ใช้ ctypes จะไม่ทำงานใน Jython ในทำนองเดียวกันถ้าคุณต้องการใช้ Java Class คุณไม่สามารถทำได้โดยตรงจาก CPython คุณอาจต้องการกาว (JEPP) หรือจำเป็นต้องใช้ Jython (The Java Implementation of Python)


4

คุณควรทราบว่า CPython ไม่ได้โดดสนับสนุน multithreading เพราะGlobal ล่ามล็อค นอกจากนี้ยังไม่มีกลไกการปรับให้เหมาะสมสำหรับการเรียกซ้ำและมีข้อ จำกัด อื่น ๆ อีกมากมายที่การใช้งานและไลบรารีอื่น ๆ พยายามเติม

คุณควรดูที่หน้านี้ในวิกิหลาม

ดูตัวอย่างรหัสในหน้านี้มันจะทำให้คุณมีความคิดที่ดีว่าล่ามคืออะไร


17
CPython รองรับการทำงานแบบมัลติเธรด แต่ GIL ทำให้ยากต่อการใช้ประโยชน์จากหลายคอร์หรือซีพียู นั่นไม่ใช่สิ่งเดียวกับที่ไม่รองรับมัลติเธรดเลย
Martijn Pieters

0

การใช้งานดั้งเดิมและมาตรฐานของPythonมักจะถูกเรียกใช้CPythonเมื่อคุณต้องการเปรียบเทียบกับตัวเลือกอื่น ๆ ( และเพียงธรรมดา“ Python” มิฉะนั้น ) ANSI C language codeชื่อนี้มาจากความจริงที่ว่ามันเป็นรหัสในการพกพา นี่คือ Python ที่คุณดึงมาจากhttp://www.python.org , ใช้งานActivePythonและการ แจกแจงแบบคิดแม้กระทั่งโดยอัตโนมัติบนเครื่อง Linux และ Mac OS X ส่วนใหญ่ หากคุณพบ Python เวอร์ชันที่ติดตั้งไว้แล้วในเครื่องของคุณอาจเป็น CPythonไปได้เว้นแต่ว่า บริษัท หรือองค์กรของคุณกำลังใช้ Python ด้วยวิธีพิเศษเพิ่มเติม

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


3
ฉันไม่ได้ตั้งใจจะหยาบคาย แต่ CPython ไม่ได้ทำงานเร็วที่สุด
Myles Hollowed

0

การใช้ภาษาการเขียนโปรแกรมเป็นระบบสำหรับการรันโปรแกรมคอมพิวเตอร์

มีวิธีการทั่วไปสองวิธีในการปรับใช้ภาษาโปรแกรม:

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

Pythonเป็นภาษาการเขียนโปรแกรมระดับสูงตีความที่สร้างโดยGuido van Rossumในปี 1991

CPythonเป็นรุ่นอ้างอิงของภาษาคอมพิวเตอร์ Python ซึ่งเขียนด้วยภาษา C ซึ่งสร้างโดยGuido van Rossumเช่นกัน

รายการอื่น ๆ ของการใช้งาน Python

แหล่ง

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