CPython — эталонная реализация языка программирования Python . Написанный на C и Python, CPython является стандартной и наиболее широко используемой реализацией языка Python.
CPython можно определить как интерпретатор , так и компилятор , поскольку он компилирует код Python в байт-код перед его интерпретацией. Он имеет внешний интерфейс функций с несколькими языками, включая C, в котором необходимо явно писать привязки на языке, отличном от Python.
Особенностью CPython является то, что он использует глобальную блокировку интерпретатора (GIL) для каждого процесса интерпретатора CPython , что означает, что в пределах одного процесса только один поток может обрабатывать байт-код Python в любой момент времени. [2] Это не означает, что в многопоточности нет смысла ; наиболее распространенный сценарий многопоточности — это когда потоки в основном ожидают завершения внешних процессов.
Это может произойти, когда несколько потоков обслуживают отдельных клиентов. Один поток может ожидать ответа клиента, а другой может ожидать выполнения запроса к базе данных , в то время как третий поток фактически обрабатывает код Python.
Однако GIL означает, что CPython не подходит для процессов, которые реализуют ресурсоемкие алгоритмы в коде Python, который потенциально может быть распределен по нескольким ядрам.
В реальных приложениях ситуации, когда GIL является существенным узким местом, довольно редки. Это связано с тем, что Python по своей сути является медленным языком и обычно не используется для операций с интенсивным использованием ЦП или операций, чувствительных ко времени. Python обычно используется на верхнем уровне и вызывает функции в библиотеках для выполнения специализированных задач. Эти библиотеки обычно не написаны на Python, и код Python в другом потоке может выполняться во время вызова одного из этих базовых процессов. Библиотека, не относящаяся к Python, вызываемая для выполнения ресурсоемкой задачи, не подпадает под действие GIL и может без ограничений одновременно выполнять множество потоков на нескольких процессорах.
Параллелизм кода Python может быть достигнут только с помощью отдельных процессов интерпретатора CPython, управляемых многозадачной операционной системой . Это усложняет взаимодействие между параллельными процессами Python , хотя модуль многопроцессорности несколько смягчает это; это означает, что приложения, которые действительно могут извлечь выгоду из одновременного выполнения кода Python, могут быть реализованы с ограниченными накладными расходами .
Наличие GIL упрощает реализацию CPython и упрощает реализацию многопоточных приложений, которые не получают преимуществ от одновременного выполнения кода Python. Однако без GIL многопроцессорные приложения должны гарантировать, что весь общий код является потокобезопасным.
Хотя было сделано много предложений по отмене GIL, общее мнение заключалось в том, что в большинстве случаев преимущества GIL перевешивают недостатки; в тех немногих случаях, когда GIL является узким местом, приложение должно быть построено на основе многопроцессорной структуры. Чтобы обеспечить больший параллелизм, в октябре 2023 года было выпущено улучшение, позволяющее использовать отдельный GIL для каждого субинтерпретатора в одном процессе Python, которое было описано как «потоки с возможностью совместного использования». [3] [4]
После нескольких дебатов в 2023 году был запущен проект, предлагающий сделать GIL необязательным для версии Python 3.13 [5] , выпуск которой запланирован на октябрь 2024 года. [6]
Unladen Swallow — это оптимизационная ветвь CPython, призванная быть полностью совместимой и значительно более быстрой. Компания стремилась достичь своих целей, дополнив специальную виртуальную машину CPython JIT-компилятором , созданным с использованием LLVM .
В проекте была поставлена цель повысить скорость в пять раз по сравнению с CPython; [7] эта цель не была достигнута. [8]
Спонсором проекта выступила компания Google , а владельцы проекта Томас Воутерс, Джеффри Ясскин и Коллин Винтер являются штатными сотрудниками Google; однако большинство участников проекта не были сотрудниками Google. [9] Unladen Swallow размещалась на Google Code . [10]
Как и многие другие вещи, связанные с языком Python, название Unladen Swallow является отсылкой к Монти Пайтону , в частности, к шутке о скорости полета порожних ласточек в фильме «Монти Пайтон и Святой Грааль» .
Несмотря на то, что Unladen Swallow не достиг всех опубликованных целей, он все же создал некоторый код, который был добавлен в основную реализацию Python, например улучшения модуля cPickle. [11]
В июле 2010 года некоторые наблюдатели высказали предположения о том, мертв ли проект или умирает, поскольку контрольный показатель четвертого квартала 2009 года еще не был опубликован. [12] Трафик в списке рассылки Unladen снизился с 500 сообщений в январе 2010 года до менее 10 в сентябре 2010 года . [13] Также сообщалось, что Unladen лишился финансирования со стороны Google. [14] В ноябре 2010 года один из основных разработчиков объявил, что «Джеффри и меня привлекли к другим проектам, более важным для Google». [15]
Ветка разработки четвертого квартала 2009 года была создана 26 января 2010 года, [16] но на сайте не было рекламы. Далее, что касается долгосрочных планов, а также поскольку проект пропустил выпуск Python 2.7, было принято Предложение по усовершенствованию Python (PEP) [8] , в котором предлагалось объединить Unladen Swallow со специальной веткой py3k-jit официального репозитория Python. . По состоянию на июль 2010 года эта работа продолжалась. [17] Это слияние заняло бы некоторое время, поскольку Unladen Swallow изначально был основан на Python 2.6 [18] с которым Python 3 нарушил совместимость ( более подробную информацию см. в Python 3000 ). Однако впоследствии PEP был отозван.
В начале 2011 года стало ясно, что проект остановлен. [19]
Официально поддерживаемыми платформами уровня 1 являются Windows , Linux и macOS . (Также ОС Raspberry Pi и Linux для s390x на нижнем уровне.)
На других платформах есть рабочие реализации, в том числе: [23]
В PEP 11 [24] перечислены платформы, которые не поддерживаются в CPython Python Software Foundation . Эти платформы по-прежнему могут поддерживаться внешними портами. Эти порты включают в себя:
Внешние порты, не интегрированные в официальную версию CPython от Python Software Foundation, со ссылками на основной сайт разработки, часто включают дополнительные модули для функций, специфичных для платформы, таких как графический и звуковой API для PSP и SMS, а также API камеры для S60. Эти порты включают в себя:
Эти версии Python распространяются вместе с поддерживаемыми в настоящее время корпоративными дистрибутивами Linux. [33] Статус поддержки Python в таблице относится к поддержке со стороны основной команды Python, а не со стороны сопровождающего дистрибутива.
CPython — одна из нескольких реализаций Python «производственного качества», включая: Jython , написанный на Java для виртуальной машины Java (JVM), PyPy , написанный на RPython и переведенный на C, и IronPython , написанный на C# для общего языка. Инфраструктура . Есть также несколько экспериментальных реализаций. [55]