Python против Cpython

447

Что это за шум вокруг Python и CPython (Jython, IronPython) , я не понимаю:

python.org упоминает, что CPython это:

«Традиционная» реализация Python (по прозвищу CPython)

еще один вопрос переполнения стека упоминает, что:

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

Честно говоря, я не понимаю, что оба эти объяснения практически означают, но я подумал, что если я использую CPython, это значит, когда я запускаю пример кода Python, он компилирует его на язык C, а затем выполняет его так, как если бы он был C код

Так что же такое CPython и как он отличается от Python, и стоит ли мне использовать CPython над Python, и если да, то в чем его преимущества?

K DawG
источник
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 ранее, вы можете столкнуться с множеством сюрпризов, потому что разработчики недостаточно тестировали свои библиотеки на этой платформе.
Рахму
9
Сказать, что «PyPy быстрее, чем CPython», немного опасно, я бы сказал. Здесь есть очень хороший ответ именно на этот вопрос: stackoverflow.com/questions/18946662/…
Макс Леске
Я был в восторге от IronPython ... пока не увидел, что он поддерживает только Python 2.x.
Шон Андерсон
@SeanAnderson: То же самое относится и к Jython (до 2015 года официальный релиз был совместим только с 2.5, что делало его устаревшим на девять лет; в 2015 году они наконец выпустили 2.7, но по-прежнему не было никаких признаков выпуска 3.x).
ShadowRanger
90

Вы должны различать язык и реализацию. Python - это язык,

Согласно Википедии , «язык программирования - это нотация для написания программ, которые являются спецификациями вычисления или алгоритма». Это означает, что это просто правила и синтаксис для написания кода. Отдельно у нас есть реализация языка программирования, которая в большинстве случаев является реальным интерпретатором или компилятором.

Python - это язык. CPython - это реализация Python на C. Jython - это реализация на Java и так далее.

Подводя итог: вы уже используете CPython (если вы скачали отсюда ).

jamylak
источник
2
Вы должны прочитать статью Мартина Питерса «CPython не переводит ваш код Python на C сам по себе. Вместо этого он запускает цикл интерпретатора. Есть проект, который переводит код Python-ish в C и называется Cython»
Raymond Шенон
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 : Это язык, он только устанавливает / описывает, как передать / выразить себя интерпретатору (программе, которая принимает ваш код 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 (интерпретатором).

ПРИМЕЧАНИЕ . Я получил ссылку на этот код с IRC-канала #python: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c.

И затем, есть Jython, который написан на Java и в конечном итоге производит байт-код Java. Байт-код Java работает в среде выполнения Java, которая является реализацией виртуальной машины Java (JVM). Если это сбивает с толку, то я подозреваю, что вы понятия не имеете, как работает Java. С точки зрения непрофессионала, код Java (язык, а не компилятор) берется компилятором Java и выводит файл (который является байтовым кодом Java), который может быть запущен только с использованием JRE. Это сделано для того, чтобы после компиляции кода Java его можно было перенести на другие машины в формате байтового кода Java, который может выполняться только JRE. Если это все еще сбивает с толку, то вы можете взглянуть на эту веб-страницу .

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

Итак, в Jython, когда вы компилируете свой код Python, вы получаете Java-байт-код, который может быть запущен на JVM.

Точно так же IronPython (написанный на языке C #) компилирует ваш код Python в Common Language Runtime (CLR), который является аналогичной технологией по сравнению с JVM, разработанным Microsoft.

Виджай Кумар
источник
3
Спасибо за подробное объяснение! Это означает, что CPython заботится о преобразовании кода Python в байт-код, а также интерпретирует байт-код в машинный код? В ореховой оболочке CPython есть компилятор (для Python в байт-код) и виртуальная машина Python (для байт-кода в машинный код)? По сравнению с .Net, есть компилятор C # для преобразования C # в MSIL и CLR для преобразования из MSIL в машинный код.
rahulaga_dev
30

Эта статья подробно объясняет разницу между различными реализациями Python. Как написано в статье:

Первое, что нужно понять, это то, что «Python» - это интерфейс. Существует спецификация того, что должен делать Python и как он должен вести себя (как с любым интерфейсом). И есть несколько реализаций (как с любым интерфейсом).

Второе, что нужно понять, это то, что «интерпретированный» и «скомпилированный» являются свойствами реализации, а не интерфейса.

shaktimaan
источник
20

Python - это язык: набор правил, которые можно использовать для написания программ. Есть несколько реализаций этого языка.

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

CPython - это оригинальная реализация, написанная на C. (Часть «C» в «CPython» относится к языку, который использовался для написания самого интерпретатора Python.)

Jython - это тот же язык (Python), но реализованный с использованием Java.

Интерпретатор IronPython был написан на C #.

Также есть PyPy - интерпретатор Python, написанный на Python. Сделай свой выбор :)

Орленко
источник
8

implementationозначает, какой язык был использован для реализации Python, а не как будет реализован код Python. Преимущество использования CPython заключается в доступности C Run-time, а также в легкой интеграции с C / C ++.

Поэтому CPython изначально был реализован с использованием C. В первоначальной реализации были и другие форки, которые позволяли Python использовать Java (JYthon) или .NET Runtime (IronPython).

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

Abhijit
источник
4

Вы должны знать, что CPython на самом деле не поддерживает многопоточность из-за глобальной блокировки интерпретатора . Он также не имеет механизмов оптимизации для рекурсии и имеет много других ограничений, которые пытаются заполнить другие реализации и библиотеки.

Вы должны взглянуть на эту страницу в Python Wiki.

Посмотрите на фрагменты кода на этой странице, это даст вам хорошее представление о том, что такое интерпретатор.

Уссама Л.
источник
17
CPython поддерживает многопоточность, но GIL затрудняет использование нескольких ядер или процессоров. Это не совсем то же самое, что вообще не поддерживать многопоточность.
Мартин Питерс
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

Источник

Premraj
источник