Python vs Cpython


447

Tất cả những gì ồn ào về Python và CPython (Jython, IronPython) , tôi không hiểu được:

python.org đề cập rằng CPython là:

Việc triển khai "truyền thống" của Python (biệt danh CPython)

một câu hỏi khác về Stack Overflow đề cập rằng:

CPython là trình thông dịch mã byte mặc định của Python, được viết bằng C.

Thành thật tôi không hiểu ý nghĩa của cả hai cách giải thích trên thực tế nhưng điều tôi nghĩ là, nếu tôi sử dụng CPython thì điều đó có nghĩa là khi tôi chạy mã python mẫu, nó biên dịch nó thành ngôn ngữ C và sau đó thực thi nó như thể C mã

Vậy CPython chính xác là gì và nó khác nhau như thế nào khi so sánh với python và tôi có nên sử dụng CPython hơn Python và nếu vậy thì lợi thế của nó là gì?


Câu trả lời:


688

Vậy CPython là gì?

CPython là bản triển khai Python gốc . Đây là triển khai bạn tải xuống từ Python.org. Mọi người gọi nó là CPython để phân biệt nó với các triển khai Python khác, sau này và để phân biệt việc triển khai công cụ ngôn ngữ với chính ngôn ngữ lập trình Python .

Phần sau là nơi mà sự nhầm lẫn của bạn đến từ; bạn cần tách biệt ngôn ngữ Python với bất kỳ thứ gì chạy mã Python.

CPython tình cờ được thực hiện trong C. Đó chỉ là một chi tiết thực hiện. CPython biên dịch mã Python của bạn thành mã byte (trong suốt) và diễn giải mã byte đó trong một vòng đánh giá.

CPython cũng là người đầu tiên thực hiện các tính năng mới; Phát triển ngôn ngữ Python sử dụng CPython làm cơ sở; thực hiện khác theo.

Thế còn Jython, v.v?

Jython , IronPythonPyPy là các triển khai "khác" hiện tại của ngôn ngữ lập trình Python; chúng được triển khai trong Java, C # và RPython (một tập hợp con của Python), tương ứng. Jython biên dịch mã Python của bạn thành mã byte Java , vì vậy mã Python của bạn có thể chạy trên JVM. IronPython cho phép bạn chạy Python trên Microsoft CLR . Và PyPy, được triển khai trong (một tập hợp con) của Python, cho phép bạn chạy mã Python nhanh hơn CPython, điều này sẽ khiến bạn phải suy nghĩ. :-)

Thực tế biên dịch sang C

Vì vậy, CPython không tự dịch mã Python của bạn sang C. Thay vào đó, nó chạy một vòng lặp phiên dịch. Có một dự án mà không dịch mã Python-ish đến C, và đó được gọi là Cython . Cython thêm một vài phần mở rộng cho ngôn ngữ Python và cho phép bạn biên dịch mã của mình thành các phần mở rộng C, mã cắm vào trình thông dịch CPython.


92
Tôi nghĩ rằng đáng để đề cập rằng, về mặt lý thuyết, một kịch bản python có thể được chạy bằng cách sử dụng bất kỳ triển khai nào và kết quả của việc chạy tập lệnh sẽ giống nhau.
Douglas Mendizábal

3
Như một vấn đề thực tế, và tùy thuộc vào dự án mà bạn đang thực hiện, có thể là một ý tưởng tốt để kiểm tra và lập hồ sơ mã Python của bạn trên một số triển khai. Đã từng làm việc với các dự án Java + Jython trước đây, bạn có thể gặp nhiều bất ngờ vì các nhà phát triển chưa kiểm tra libs của họ đủ trên nền tảng này.
rahmu

9
Nói rằng "PyPy nhanh hơn CPython" thì hơi nguy hiểm. Có một câu trả lời rất hay cho chính xác câu hỏi đó tại đây: stackoverflow.com/questions/18946662/iêu
Max Leske

Đã hào hứng với IronPython ... cho đến khi tôi thấy rằng nó chỉ hỗ trợ Python 2.x.
Sean Anderson

@SeanAnderson: Tương tự với Jython (cho đến năm 2015, bản phát hành chính thức chỉ tương thích với 2,5, đã hết hạn 9 năm, cuối cùng họ đã có bản phát hành 2.7 ra khỏi năm 2015, nhưng vẫn không có dấu hiệu của bản phát hành 3.x).
ShadowRanger

89

Bạn cần phân biệt giữa một ngôn ngữ và việc thực hiện. Python là một ngôn ngữ,

Theo Wikipedia , "Ngôn ngữ lập trình là ký hiệu để viết chương trình, là thông số kỹ thuật của tính toán hoặc thuật toán". Điều này có nghĩa là nó đơn giản là các quy tắc và cú pháp để viết mã. Riêng chúng tôi có một triển khai ngôn ngữ lập trình mà trong hầu hết các trường hợp, là trình thông dịch hoặc trình biên dịch thực tế.

Python là một ngôn ngữ. CPython là triển khai Python trong C. Jython là triển khai trong Java, v.v.

Tóm lại: Bạn đã sử dụng CPython (nếu bạn đã tải xuống từ đây ).


2
Bạn nên đọc bài đăng của CPijthon "CPython không tự dịch mã Python của mình sang C. Nó thay vào đó chạy một vòng lặp trình thông dịch. Có một dự án dịch mã Python-ish sang C và được gọi là Cython"
Raymond Chenon

2
Tại sao có quá nhiều sự nhấn mạnh về Cpython. tức là: chúng tôi không nghe thấy Cc ++ hoặc CJava hoặc thậm chí CSwift. Hay tôi đang thiếu một cái gì đó?
Suhaib

3
@Suhaib: họ làm, trong thế giới Java, người ta có ví dụ HotSpot, OpenJDK, IBM J9 JDK, Azul. Chúng thường chính xác hơn, tức là bạn không thực sự thấy "cài đặt Java" mà là "cài đặt JDK Java 8 tương thích, ví dụ như Oracle JDK 8". Trong thế giới JavaScript, bạn có node.js, V8, v.v. Bạn "cài đặt node.js", không phải "cài đặt JavaScript", phải không? Nhưng trong thế giới Python, việc nói "cài đặt Python 3.6" là khá phổ biến, chỉ nói đến một đặc tả ngôn ngữ, không phải là thời gian chạy cụ thể.
Hendy I Girls

37

Ngay cả tôi cũng gặp vấn đề tương tự khi hiểu CPython, JPython, IronPython, PyPy khác nhau như thế nào.

Vì vậy, tôi sẵn sàng làm rõ ba điều trước khi bắt đầu giải thích:

  1. Python : Đây là một ngôn ngữ, nó chỉ nêu / mô tả cách truyền đạt / thể hiện bản thân với người phiên dịch (chương trình chấp nhận mã python của bạn).
  2. Thực hiện : Đó là tất cả về cách người phiên dịch được viết, cụ thể, bằng ngôn ngữ nàocuối cùng nó làm gì .
  3. Mã byte : Đây là mã được xử lý bởi một chương trình, thường được gọi là máy ảo, thay vì máy tính "thực", bộ xử lý phần cứng.

CPython là việc thực hiện, được viết bằng ngôn ngữ C. Nó kết thúc việc tạo ra mã byte (bộ hướng dẫn dựa trên máy stack), cụ thể là Python và sau đó thực thi nó. Lý do để chuyển đổi mã Python thành mã byte là bởi vì việc triển khai trình thông dịch sẽ dễ dàng hơn nếu nó trông giống như hướng dẫn của máy. Nhưng, không cần thiết phải tạo một số mã byte trước khi thực thi mã Python (nhưng CPython không tạo ra).

Nếu bạn muốn xem mã byte của CPython thì bạn có thể. Đây là cách bạn có thể:

>>> 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

Bây giờ, chúng ta hãy xem mã trên. Dòng 1 đến 6 là một định nghĩa hàm. Trong dòng 8, chúng tôi nhập mô-đun 'dis' có thể được sử dụng để xem mã byte trung gian của Python (hoặc bạn có thể nói, trình dịch ngược mã cho mã byte Python) được tạo bởi CPython (trình thông dịch).

LƯU Ý : Tôi đã nhận được liên kết tới mã này từ kênh #python IRC: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

Và sau đó, có Jython, được viết bằng Java và cuối cùng tạo ra mã byte Java. Mã byte Java chạy trên Môi trường chạy thi hành Java, đây là một triển khai của Máy ảo Java (JVM). Nếu điều này gây nhầm lẫn thì tôi nghi ngờ rằng bạn không biết Java hoạt động như thế nào. Theo thuật ngữ layman, mã Java (ngôn ngữ, không phải trình biên dịch) được trình biên dịch Java lấy và xuất ra một tệp (là mã byte Java) chỉ có thể chạy bằng JRE. Điều này được thực hiện sao cho, khi mã Java được biên dịch thì nó có thể được chuyển sang các máy khác ở định dạng mã byte Java, chỉ có thể được chạy bởi JRE. Nếu điều này vẫn còn gây nhầm lẫn thì bạn có thể muốn xem trang web này .

Ở đây, bạn có thể hỏi liệu mã byte của CPython có di động như Jython không, tôi nghi ngờ là không. Mã byte được tạo ra trong triển khai CPython dành riêng cho trình thông dịch đó để giúp thực thi mã dễ dàng hơn (tôi cũng nghi ngờ rằng, việc sản xuất mã byte trung gian như vậy, chỉ để dễ xử lý được thực hiện trong nhiều trình thông dịch khác).

Vì vậy, trong Jython, khi bạn biên dịch mã Python, bạn kết thúc bằng mã byte Java, có thể chạy trên JVM.

Tương tự, IronPython (được viết bằng ngôn ngữ C #) biên dịch mã Python của bạn thành Common Language Runtime (CLR), đây là một công nghệ tương tự như so với JVM, được phát triển bởi Microsoft.


3
thx để giải thích chi tiết !! Điều này có nghĩa là CPython đảm nhiệm việc chuyển đổi mã Python thành Mã Byte và cũng diễn giải mã byte thành mã máy? Trong nut shell CPython là Compiler (cho Python to Byte Code) và Python Virtual Machine (cho mã Byte thành mã máy)? So sánh tương tự với .Net, có Trình biên dịch C # để chuyển đổi C # sang MSIL và CLR để chuyển đổi từ mã MSIL sang mã máy.
rahulaga_dev

30

Bài viết này giải thích cặn kẽ sự khác biệt giữa các triển khai khác nhau của Python. Giống như bài viết đặt nó:

Điều đầu tiên nhận ra là 'Python' là một giao diện. Có một đặc điểm kỹ thuật về những gì Python nên làm và cách nó hoạt động (như với bất kỳ giao diện nào). Và có nhiều triển khai (như với bất kỳ giao diện nào).

Điều thứ hai cần nhận ra là 'diễn giải' và 'được biên dịch' là các thuộc tính của việc triển khai, không phải là giao diện.


20

Python là một ngôn ngữ: một tập hợp các quy tắc có thể được sử dụng để viết chương trình. Có một số triển khai của ngôn ngữ này.

Bất kể bạn thực hiện việc gì, họ đều thực hiện khá nhiều điều tương tự: lấy văn bản chương trình của bạn và giải thích nó, thực hiện các hướng dẫn của nó. Không ai trong số họ biên dịch mã của bạn thành C hoặc bất kỳ ngôn ngữ nào khác.

CPython là bản triển khai ban đầu, được viết bằng C. (Phần "C" trong "CPython" dùng để chỉ ngôn ngữ được sử dụng để viết chính trình thông dịch Python.)

Jython là cùng một ngôn ngữ (Python), nhưng được triển khai bằng Java.

Trình thông dịch IronPython được viết bằng C #.

Ngoài ra còn có PyPy - một trình thông dịch Python được viết bằng Python. Hãy lựa chọn :)


8

implementationcó nghĩa là ngôn ngữ nào đã được sử dụng để triển khai Python chứ không phải cách python Code sẽ được thực thi. Ưu điểm của việc sử dụng CPython là sự sẵn có của C Run-time cũng như tích hợp dễ dàng với C / C ++.

Vì vậy, CPython ban đầu được thực hiện bằng cách sử dụng C. Có những nhánh khác cho việc triển khai ban đầu cho phép Python có thể sử dụng Java (JYthon) hoặc .NET Runtime (IronPython).

Dựa trên việc bạn sử dụng Triển khai nào, tính khả dụng của thư viện có thể khác nhau, ví dụ, Ctypes không có sẵn trong Jython , vì vậy mọi thư viện sử dụng ctypes sẽ không hoạt động trong Jython. Tương tự, nếu bạn muốn sử dụng Lớp Java, bạn không thể trực tiếp làm như vậy từ CPython. Bạn cần một keo (JEPP) hoặc cần sử dụng Jython (Việc triển khai Java của Python)


4

Bạn nên biết rằng CPython không thực sự hỗ trợ đa luồng vì Khóa phiên dịch toàn cầu . Nó cũng không có cơ chế Tối ưu hóa cho đệ quy và có nhiều hạn chế khác mà các triển khai và thư viện khác cố gắng lấp đầy.

Bạn nên xem trang này trên wiki python.

Nhìn vào các đoạn mã trên này trang, nó sẽ cung cấp cho bạn một ý tưởng tốt về những gì một thông dịch viên là.


17
CPython hỗ trợ đa luồng, nhưng GIL khiến cho việc tận dụng nhiều lõi hoặc CPU trở nên khó khăn. Điều đó hoàn toàn không giống với việc không hỗ trợ đa luồng.
Martijn Pieters

0

Việc triển khai Python ban đầu và tiêu chuẩn thường được gọi CPythonkhi bạn muốn đối chiếu nó với các tùy chọn khác ( và chỉ đơn giản là Python Python thôi ). Tên này xuất phát từ thực tế là nó được mã hóa trong xách tay ANSI C language code. Đây là Python mà bạn tìm nạp từ http://www.python.org , nhận các bản phân phối ActivePythonEnth think và tự động trên hầu hết các máy Linux và Mac OS X. Nếu bạn đã tìm thấy phiên bản Python được cài đặt sẵn trên máy của mình, thì có lẽ CPython, trừ khi công ty hoặc tổ chức của bạn đang sử dụng Python theo những cách chuyên biệt hơn.

Trừ khi bạn muốn tập lệnh Javahoặc .NETứng dụng với Python hoặc tìm thấy lợi ích của Stacklesshoặc PyPyhấp dẫn, bạn có thể muốn sử dụng CPythonhệ thống tiêu chuẩn . Bởi vì nó là triển khai tham chiếu của ngôn ngữ, nó có xu hướng chạy nhanh nhất, hoàn thiện nhất và cập nhật và mạnh mẽ hơn các hệ thống thay thế.


3
Tôi không có ý thô lỗ, nhưng CPython hoàn toàn không chạy nhanh nhất.
Myles rỗng

0

Một ngôn ngữ lập trình thực hiện là một hệ thống để thực hiện các chương trình máy tính.

Có hai cách tiếp cận chung để thực hiện ngôn ngữ lập trình:

  • Giải thích : Trình thông dịch sẽ lấy đầu vào của một chương trình bằng một số ngôn ngữ và thực hiện các hành động được viết bằng ngôn ngữ đó trên một số máy.
  • Biên dịch : Trình biên dịch lấy đầu vào là chương trình trong một số ngôn ngữ và dịch chương trình đó sang một ngôn ngữ khác, có thể đóng vai trò là đầu vào cho trình thông dịch khác hoặc trình biên dịch khác.

Con trăn là một ngôn ngữ lập trình cấp cao được giải thích được tạo bởi Guido van Rossum vào năm 1991.

CPython là phiên bản tham chiếu của ngôn ngữ điện toán Python, được viết bằng C được tạo bởi Guido van Rossum .

Danh sách khác về triển khai Python

Nguồn

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.