Пітон проти Cpython


447

У чому вся ця суєта щодо Python та CPython (Jython, IronPython) , я не розумію:

python.org згадує, що CPython є:

"Традиційна" реалізація Python (прозвана CPython)

ще одне питання переповнення стека згадує:

CPython - інтерпретатор байт-коду за замовчуванням Python, який написаний на C.

Чесно кажучи, я не розумію, що обидва ці пояснення практично означають, але те, що я думав, це те, що якщо я використовую CPython, це означає, що коли я запускаю зразок коду python, він компілює його на мову C, а потім виконує так, ніби це був C код

Отже, що саме являє собою CPython і як він відрізняється порівняно з python, і чи повинен я, мабуть, використовувати CPython над Python? Якщо так, то які його переваги?


1
Повідомлення, пов’язані з цим - Чи є різниця між cpython та python
RBT

Відповіді:


689

Отже, що таке CPython?

CPython - оригінальна реалізація Python. Це реалізація, яку ви завантажуєте з Python.org. Люди називають це CPython, щоб відрізняти його від інших, пізніших, реалізацій Python, і відрізняти реалізацію мовного двигуна від мови програмування Python .

Остання частина - звідки походить ваша плутанина; вам потрібно тримати мову Python окремо від того, що працює з кодом Python.

CPython трапляється бути реалізована в C. Це просто деталь реалізації, на самому ділі. CPython компілює ваш код Python у байт-код (прозоро) та інтерпретує цей байт-код у циклі оцінки.

CPython також є першим, хто впровадив нові функції; Розробка мови Python використовує CPython як основу; слідують інші реалізації.

Що з Jython тощо?

Jython , IronPython та PyPy - це поточні "інші" реалізації мови програмування Python; вони реалізовані в Java, C # та RPython (підмножині Python) відповідно. Jython компілює ваш код Python в байт- код Java , щоб ваш код Python міг працювати на JVM. IronPython дозволяє запускати Python в Microsoft CLR . І PyPy, реалізований у (підмножині) Python, дозволяє запускати Python-код швидше, ніж CPython, що справедливо має підірвати ваш розум. :-)

Фактично компілюючи на C

Отже, CPython не переводить ваш код Python в C сам по собі. Замість цього він працює цикл інтерпретатора. Там є проект , який робить переклад Python-МІГ код на C, і що називається Cython . Cython додає кілька розширень до мови Python і дозволяє компілювати свій код до розширень C, коду, який підключається до інтерпретатора CPython.


93
Я думаю, що варто згадати, що теоретично сценарій python може бути запущений за допомогою будь-якої з реалізацій, і результати запуску сценарію повинні бути однаковими.
Дуглас Мендісабаль

3
Власне кажучи, і залежно від проекту, над яким ви працюєте, може бути хорошою ідеєю перевірити і профайлювати ваш код Python на кількох реалізаціях. Попередньо працюючи над проектами Java + Jython, ви можете зіткнутися з багатьма сюрпризами, оскільки розробники недостатньо перевірили свої зв'язки на цій платформі.
rahmu

9
Сказати, що "PyPy швидше CPython", я б сказав, що це трохи небезпечно. Там дуже хороший відповідь на це питання саме тут: stackoverflow.com/questions/18946662 / ...
Макс Лісочка

Хвилювався про IronPython ... поки я не побачив, що він підтримує лише Python 2.x.
Шон Андерсон

@SeanAnderson: Те ж саме стосується Jython (до 2015 року офіційний реліз був лише 2,5 сумісним, що зробило його дев'ятьма роками; вони нарешті отримали 2,7 випуску за двері у 2015 році, але все ще немає ознак випуску 3.x).
ShadowRanger

90

Потрібно розрізняти мову та реалізацію. Python - це мова,

Згідно з Вікіпедією , "мова програмування - це позначення для написання програм, які є специфікаціями обчислення або алгоритму". Це означає, що це просто правила та синтаксис для написання коду. Окремо ми маємо реалізацію мови програмування яка в більшості випадків є фактичним перекладачем або компілятором.

Python - це мова. CPython - це реалізація Python в C. Jython - це реалізація в Java тощо.

Підводячи підсумок: Ви вже використовуєте CPython (якщо ви завантажили звідси ).


2
Ви повинні прочитати публікацію Мартіна Пітерса "CPython не переводить ваш код Python на C. Він замість цього виконує цикл інтерпретатора. Є проект, який переводить код Python-ish в C, і це називається Cython"
Реймонд Шенон

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 досить часто говорити "встановити Python 3.6" і робити це, посилаючись на специфікацію мови, а не на конкретний час виконання.
Хенді Іраван

37

Навіть у мене була однакова проблема розуміння того, чим CPython, JPython, IronPython, PyPy відрізняються один від одного.

Отже, я готовий очистити три речі, перш ніж почати пояснювати:

  1. Пітон : Це мова, вона лише констатує / описує, як передати / виразити себе інтерпретатору (програма, яка приймає ваш код python).
  2. Впровадження : Це все про те, як письмово було написано перекладачем, якою мовою та чим він закінчується .
  3. Байт-код : це код, який обробляється програмою, зазвичай називається віртуальною машиною, а не "справжньою" комп'ютерною машиною, апаратним процесором.

CPython - це реалізація, яка була написана мовою С. Це в кінцевому підсумку створює байт-код (набір команд на основі стека), який є специфічним для Python, а потім виконує його. Причина перетворення Python-коду в байт-код полягає в тому, що простіше втілити інтерпретатор, якщо це схоже на машинні інструкції. Але перед виконанням 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 (або, можна сказати, розбиральника для байтового коду Python), що генерується CPython (інтерпретатором).

ПРИМІТКА . Я отримав посилання на цей код з каналу #python IRC: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

І тоді, є Jython, який написаний на Java і в кінцевому підсумку виробляє байт-код Java. Байт-код Java працює в середовищі виконання Java Java, що є реалізацією віртуальної машини Java (JVM). Якщо це заплутано, я підозрюю, що ви не маєте поняття, як працює Java. По-простому, код Java (мова, а не компілятор) приймається компілятором Java і видає файл (який є байт-кодом Java), який можна запустити лише за допомогою JRE. Це робиться для того, що після компіляції коду Java він може бути перенесений на інші машини у форматі байтового коду Java, який може працювати тільки JRE. Якщо це все ще заплутано, можливо, ви захочете переглянути цю веб-сторінку .

Тут ви можете запитати, чи байт-код CPython такий портативний, як Jython, я підозрюю, що ні. TheБайткод проводиться в реалізації CPython був спеціально для цього перекладачем , що робить його легким для подальшого виконання коду (я підозрюю , що таке проміжне виробництво байткод, просто для зручності обробки робиться в багатьох інших перекладачів).

Так, у Jython, коли ви компілюєте свій код Python, ви отримуєте байт-код Java, який можна запустити на JVM.

Аналогічно, IronPython (написаний мовою C #) збирає ваш код Python до загальної мови виконання (CLR), що є аналогічною технологією порівняно з JVM, розробленою Microsoft.


3
THX для детального пояснення !! Це означає, що CPython піклується про перетворення коду Python в байт-код, а також інтерпретує байт-код в машинний код? У оболонці горіхів CPython - це компілятор (для Python до байтового коду) та віртуальна машина Python (для байтового коду до машинного коду)? Порівнюючи те саме .Net, є C # компілятор для перетворення C # в MSIL і CLR для перетворення з MSIL в код машини.
rahulaga_dev

30

Ця стаття докладно пояснює різницю між різними реалізаціями Python. Як сказано в статті:

Перше, що потрібно усвідомити, це те, що "Python" - це інтерфейс. Існує специфікація того, що повинен робити Python і як він повинен вести себе (як у будь-якому інтерфейсі). І є кілька реалізацій (як і будь-який інтерфейс).

Друге, що слід усвідомити, це те, що "інтерпретовані" та "складені" є властивостями реалізації, а не інтерфейсом.


20

Python - це мова: набір правил, за допомогою яких можна писати програми. Існує кілька реалізацій цієї мови.

Незалежно від того, яку реалізацію ви берете, вони роблять майже те саме: беруть текст вашої програми та інтерпретують її, виконуючи її вказівки. Жоден з них не компілює ваш код на C чи будь-яку іншу мову.

CPython - це оригінальна реалізація, написана на C. (Частина "C" у "CPython" стосується мови, яка використовувалася для написання інтерпретатора Python.)

Jython - це та сама мова (Python), але реалізована за допомогою Java.

Інтерпретатор IronPython був написаний на C #.

Також є PyPy - інтерпретатор Python, написаний на Python. Зробіть свій вибір :)


8

implementationозначає, яку мову використовували для реалізації Python, а не те, як реалізуватиметься Python Code. Перевагою використання CPython є наявність часу виконання C, а також легка інтеграція з C / C ++.

Тож CPython спочатку був реалізований з використанням C . До оригінальної реалізації були інші вилки, які дозволили Python перевертати Java (JYthon) або .NET Runtime (IronPython).

Залежно від того, яку реалізацію ви використовуєте, доступність бібліотеки може відрізнятися, наприклад, Ctypes недоступний у Jython , тому будь-яка бібліотека, яка використовує ctypes, не працюватиме в Jython. Так само, якщо ви хочете використовувати клас Java, ви не можете це зробити безпосередньо з CPython. Вам або потрібен клей (JEPP), або потрібно використовувати Jython (реалізація Java Python)


4

Ви повинні знати, що CPython насправді не підтримує багатопотоковість через блокування Global Interpreter Lock . Він також не має механізмів оптимізації для рекурсії та має багато інших обмежень, які намагаються заповнити інші програми та бібліотеки.

Подивіться на цю сторінку на вікі пітона.

Подивіться фрагменти коду на цій сторінці, це дасть вам хороше уявлення про те, що таке перекладач.


17
CPython підтримує багатопотоковість, але GIL ускладнює використання декількох ядер або ЦП. Це не зовсім те саме, що взагалі не підтримувати багатопоточність.
Martijn Pieters

0

Оригінальну та стандартну реалізацію Python, як правило, викликають, CPythonколи ви хочете порівняти його з іншими параметрами ( а просто просто "Python" ). Ця назва походить від того, що вона кодується портативно ANSI C language code. Це Python, який ви отримуєте з http://www.python.org , отримуєте дистрибутиви ActivePython та Enthought , і автоматично на більшості машин Linux та Mac OS X. Якщо ви знайшли на своїй машині попередньо встановлену версію Python, можливо CPython, якщо ваша компанія чи організація не використовує Python більш спеціалізованими способами.

Якщо ви не хочете писати сценарії Javaабо .NETпрограми з Python або не знайти переваги Stacklessабо PyPyпереконливі, ви, мабуть, хочете використовувати стандартну CPythonсистему. Оскільки це еталонне впровадження мови, воно, як правило, працює найшвидше, бути найповнішим і бути більш сучасним та надійним, ніж альтернативні системи.


3
Я не хочу бути грубим, але CPython абсолютно не працює найшвидше.
Майлз заглиблений

0

Реалізація мови програмування - це система виконання комп'ютерних програм.

Існує два загальні підходи до реалізації мови програмування:

  • Інтерпретація : Інтерпретатор бере на введення програму якоюсь мовою та виконує дії, написані цією мовою на якійсь машині.
  • Компіляція : Компілятор приймає програму якоюсь мовою та перекладає її на якусь іншу мову, яка може служити вводом до іншого перекладача чи іншого компілятора.

Python - інтерпретована мова програмування високого рівня, створена Гідо ван Россумом у 1991 році.

CPython - це довідкова версія обчислювальної мови Python, яка написана на C, створеній Гідо ван Россумом .

Інший перелік реалізацій Python

Джерело

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.