Введение
Референтная реализация Python
CPython — это эталонная реализация языка программирования Python. Написанный на языках C и Python, CPython является реализацией по умолчанию и наиболее широко используемой реализацией Python. CPython можно рассматривать как интерпретатор и компилятор, поскольку он компилирует код Python в байт-код перед интерпретацией. Он предоставляет интерфейс для работы с функциями, написанными на других языках, таких как C, требующий явного создания связующих модулей на языке, отличном от Python.
Дизайн
Особенностью CPython является использование глобальной блокировки интерпретатора (GIL) в каждом процессе интерпретатора CPython, что означает, что в рамках одного процесса в любой момент времени только одна нить может обрабатывать байт-код Python. Это не означает, что многопоточность бессмысленна; наиболее распространенный сценарий многопоточности – это когда потоки в основном ожидают завершения внешних процессов. Это может происходить, когда несколько потоков обслуживают отдельных клиентов. Одна нить может ждать ответа от клиента, другая – завершения запроса к базе данных, а третья – фактически обрабатывать код Python. Однако GIL означает, что CPython не подходит для процессов, реализующих ресурсоемкие алгоритмы на Python, которые потенциально можно было бы распределить по нескольким ядрам. В реальных приложениях ситуации, когда GIL становится существенным узким местом, встречаются довольно редко. Это связано с тем, что Python по своей природе – медленный язык и обычно не используется для ресурсоемких или критичных ко времени операций. Python обычно используется на верхнем уровне и вызывает функции в библиотеках для выполнения специализированных задач. Эти библиотеки, как правило, не написаны на Python, и код Python в другой нити может выполняться, пока происходит вызов одного из этих базовых процессов. Библиотека, не на Python, вызываемая для выполнения ресурсоемкой задачи, не подвержена воздействию GIL и может одновременно выполнять множество потоков на нескольких процессорах без ограничений. Параллельное выполнение кода Python возможно только с использованием отдельных процессов интерпретатора CPython, управляемых многозадачной операционной системой. Это усложняет взаимодействие между параллельными процессами Python, хотя модуль multiprocessing несколько смягчает эту проблему; это означает, что приложения, которые действительно могут выиграть от параллельного выполнения кода Python, могут быть реализованы с ограниченными накладными расходами. Наличие GIL упрощает реализацию CPython и облегчает создание многопоточных приложений, которые не выигрывают от параллельного выполнения кода Python. Однако без GIL многопроцессорные приложения должны обеспечивать потокобезопасность всего общего кода. Хотя было предложено множество способов устранения GIL, общее мнение заключается в том, что в большинстве случаев преимущества GIL перевешивают недостатки; в тех редких случаях, когда GIL является узким местом, приложение следует разрабатывать с использованием многопроцессорной архитектуры. Для повышения степени параллелизма в октябре 2023 года было выпущено обновление, позволяющее использовать отдельный GIL для каждого подчиненного интерпретатора в одном процессе Python, что было описано как "потоки с возможностью выбора совместного использования". После нескольких обсуждений в 2023 году был запущен проект по предложению сделать GIL необязательным, начиная с версии 3.13 Python, выпуск которой запланирован на октябрь 2024 года.
Незаряженная ласточка
Unladen Swallow был ветвью оптимизации CPython, предназначенной для полной совместимости и значительного увеличения скорости работы. Проект стремился достичь своих целей путем дополнения пользовательской виртуальной машины CPython JIT-компилятором, построенным на базе LLVM. Заявленной целью проекта было увеличение скорости в пять раз по сравнению с CPython, однако эта цель не была достигнута. Проект финансировался Google, а его владельцы – Томас Вутерс, Джеффри Яскин и Коллин Винтер – являлись штатными сотрудниками Google, хотя большинство участников проекта не были сотрудниками Google. Unladen Swallow размещался на Google Code. Как и многое другое, связанное с языком Python, название Unladen Swallow является отсылкой к «Монти Пайтону», в частности к шутке о скорости полета незагруженной ласточки из фильма «Монти Пайтон и Святой Грааль». Несмотря на то, что проект не достиг всех заявленных целей, он создал код, который был включен в основную реализацию Python, например, улучшения для модуля cPickle. В июле 2010 года некоторые наблюдатели высказывали предположения о том, что проект либо мертв, либо находится в состоянии упадка, поскольку релиз этапа разработки Q4 2009 года так и не состоялся. Активность в рассылке Unladen снизилась с 500 сообщений в январе 2010 года до менее чем 10 в сентябре 2010 года. Также сообщалось о прекращении финансирования проекта со стороны Google. В ноябре 2010 года один из основных разработчиков объявил, что «Джеффри и я были переведены на другие проекты, имеющие более высокий приоритет для Google». Ветвь разработки Q4 2009 года была создана 26 января 2010 года, но на веб-сайте не было объявлено о ее запуске. Более того, в отношении долгосрочных планов, и поскольку проект не успел к релизу Python 2.7, было предложено улучшение Python (PEP). Интеграция заняла бы некоторое время, поскольку Unladen Swallow изначально был основан на Python 2.6, с которым Python 3 нарушил обратную совместимость (подробнее см. Python 3000). Однако впоследствии это PEP было отозвано. В начале 2011 года стало очевидно, что проект был остановлен.