Кіріспе

Python-ның анықтамалық имплементациясы

CPython – Python бағдарламалау тілінің анықтамалық имплементациясы болып табылады. C және Python тілдерінде жазылған CPython – Python тілінің стандартты және ең көп қолданылатын нұсқасы. CPython интерпретатор да, компилятор да бола алады, себебі ол интерпретациялаудан бұрын Python кодын байт-кодқа аударады. Оның C тілі сияқты бірнеше тілдермен сыртқы функция интерфейсі бар, онда Python-нан өзге тілде байланыстарды (bindings) жасау қажет.

Дизайн

CPython-ның ерекшелігі – әрбір CPython интерпретаторы процесінде жаһандық интерпретатор құлпын (GIL) пайдалануы. Яғни, бір процесте бір уақытта тек бір ғана жіп Python байт-кодын өңдей алады. Бұл көп жіптілікте мән жоқ дегенді білдірмейді. Көп жіптіліктің ең көп таралған жағдайы – жіптердің көпшілігі сыртқы процестердің аяқталуын күтуі. Мұндай жағдай, мысалы, бірнеше жіп бөлек клиенттерге қызмет көрсеткенде туындауы мүмкін. Бір жіп клиенттен жауап күтуде, екіншісі дерекқорына сұрау салудың орындалуын күтуде, ал үшіншісі Python кодын өңдеуде болуы мүмкін. Дегенмен, GIL CPython-ның CPU-ға көп жүктеме түсіретін алгоритмдерді Python кодында жүзеге асыратын процестерге қолайсыз екенін білдіреді, мұндай алгоритмдерді бірнеше ядроға бөлуге болады. Нақты қолданыстарда GIL маңызды кедергі тудыратын жағдайлар сирек кездеседі. Өйткені Python өзінен-өзі баяу тіл және көбінесе CPU-ға көп жүктеме түсіретін немесе уақытқа сезімтал операциялар үшін қолданылмайды. Python көбінесе жоғары деңгейде қолданылады және арнайы міндеттерді орындау үшін кітапханалардағы функцияларды шақырады. Бұл кітапханалар көбінесе Python-да жазылмаған, сондықтан Python кодын басқа жіпте орындауға болады, ал кітапхана функциясын шақыру кезінде процестердің бірі күтуде болуы мүмкін. CPU-ға жүктеме түсіретін міндетті орындау үшін шақырылған Python емес кітапхана GIL-ге бағынбайды және бірнеше процессорда шектеусіз көптеген жіптерді бір мезгілде орындай алады. Python кодын бір мезгілде орындауға тек көп тапсырмалы операциялық жүйе басқаратын жеке CPython интерпретатор процестері арқылы қол жеткізуге болады. Бұл бір мезгілдегі Python процестері арасындағы байланысты қиындатады, бірақ multiprocessing модулі бұл қиындықты аздап жеңілдетеді. Бұл Python кодын бір мезгілде орындаудан пайда көретін қолданыстарды шектеулі жүктемемен жүзеге асыруға мүмкіндік береді. GIL-дің болуы CPython-ның жүзеге асырылуын жеңілдетеді және Python кодын бір мезгілде орындаудан пайда таппайтын көп жіпті қолданыстарды жүзеге асыруды оңайлатады. Алайда, GIL болмаса, көп процессорлы қолданыстар барлық ортақ кодтың жіп қауіпсіз екеніне көз жеткізуі керек. GIL-ді жою туралы көптеген ұсыныстар жасалған, бірақ жалпы консенсус бойынша, көп жағдайларда GIL-дің артықшылықтары кемшіліктерінен басым. GIL кедергі тудыратын сирек жағдайларда, қолданыс көп процессорлық архитектураға негізделген болуы керек. Көбірек параллелизмге мүмкіндік беру үшін 2023 жылдың қазан айында бір Python процесінде әрбір суб-интерпретатор үшін жеке GIL-ді пайдалануға рұқсат беретін жақсарту шығарылды, бұл «бірлесіп жұмыс істеуге дайын жіптер» деп сипатталды. Бірнеше талқылардан кейін 2023 жылы Python 3.13 нұсқасынан бастап GIL-ді міндетті емес етуді ұсынатын жоба басталды, бұл нұсқа 2024 жылдың қазанында шығуы жоспарланған.

Жүксіз құз

Unladen Swallow – CPython-ның толыққанды үйлесімді және едәуір жылдам болуы үшін жасалған оптимизациялық тармағы болды. Ол CPython-ның арнайы виртуалды машинасына LLVM-ді пайдаланып құрылған уақытында компиляторды қосу арқылы мақсаттарына жетуді көздеді. Жоба CPython-нан бес есе жылдамдыққа қол жеткізуді мақсат еткен; алайда, бұл мақсатқа жетілмеді. Жобаны Google демеушілік етті, жобаның иелері – Томас Вутерс, Джеффри Яскин және Коллин Винтер – Google-дың толық уақытты қызметкерлері болды; бірақ жобаға үлес қосқандардың көпшілігі Google қызметкерлері емес еді. Unladen Swallow Google Code платформасында орналастырылған. Python тіліне қатысты көптеген нәрселер сияқты, Unladen Swallow атауы да Monty Python-ға сілтеме, атап айтқанда Monty Python және Ысқырық қасиетті Грааль (Monty Python and the Holy Grail) фильміндегі жүксіз қарлығаштардың жылдамдығы туралы әзілге қатысты. Барлық жарияланған мақсаттарына жетпесе де, Unladen Swallow негізгі Python нұсқасына қосылған бірнеше кодтарды жасады, мысалы cPickle модулін жақсарту. 2010 жылдың шілдесінде кейбір бақылаушылар жобаның тоқтатылған-ды әлде әлі де жалғасып жатыр ма екендігі туралы пікір білдірді, себебі 2009 жылғы 4-тоқсандық кезең әлі шығарылмаған еді. Unladen пошта тізіміндегі трафик 2010 жылдың қаңтарындағы 500 хабарламадан 2010 жылдың қыркүйегінде 10-нан да аз хабарламаға дейін төмендеді. Сондай-ақ, Unladen Google-дың қаржылық қолдауын жоғалтты деген хабарлар тарады. 2010 жылдың қарашасында жобаның басты әзірлеушілерінің бірі «Джеффри менің Google үшін маңыздырақ басқа жобаларға тартылғанымызды» хабарлады. 2009 жылғы 4-тоқсандық даму тармағы 2010 жылдың 26 қаңтарында құрылды, бірақ веб-сайтта ешқандай жарнама жасалмады. Бұдан өзге, ұзақ мерзімді жоспарларға қатысты және жоба Python 2.7 нұсқасын өткізіп алғандықтан, Python Enhancement Proposal (PEP) ұсынылды. Бұл біріктіруге біраз уақыт кеткен болар еді, себебі Unladen Swallow бастапқыда Python 2.6 негізінде құрылған, ал Python 3 осы нұсқамен үйлесімділікті бұзды (толық ақпарат алу үшін Python 3000 қараңыз). Алайда, кейіннен PEP қабылданбады. 2011 жылдың басында жоба тоқтатылғаны анық болды.