πŸ•·οΈ Crawler Inspector

URL Lookup

Direct Parameter Lookup

Raw Queries and Responses

1. Shard Calculation

Query:
Response:
Calculated Shard: 134 (from laksa096)

2. Crawled Status Check

Query:
Response:

3. Robots.txt Check

Query:
Response:

4. Spam/Ban Check

Query:
Response:

5. Seen Status Check

ℹ️ Skipped - page is already crawled

πŸ“„
INDEXABLE
βœ…
CRAWLED
18 days ago
πŸ€–
ROBOTS ALLOWED

Page Info Filters

FilterStatusConditionDetails
HTTP statusPASSdownload_http_code = 200HTTP 200
Age cutoffPASSdownload_stamp > now() - 6 MONTH0.6 months ago
History dropPASSisNull(history_drop_reason)No drop reason
Spam/banPASSfh_dont_index != 1 AND ml_spam_score = 0ml_spam_score=0
CanonicalPASSmeta_canonical IS NULL OR = '' OR = src_unparsedNot set

Page Details

PropertyValue
URLhttps://habr.com/ru/companies/numdes/articles/581374/
Last Crawled2026-03-23 11:08:10 (18 days ago)
First Indexed2023-05-09 06:49:44 (2 years ago)
HTTP Status Code200
Meta TitleΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Python / Π₯Π°Π±Ρ€
Meta DescriptionΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π½Π° Python ΠΈ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅ΡΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ / Π΅Ρ‘ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΡƒ. И Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ вопросы, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡŽΡ‚ΡΡ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…,...
Meta Canonicalnull
Boilerpipe Text
ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π½Π° Python ΠΈ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅ΡΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ / Π΅Ρ‘Β  Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΡƒ. И Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ вопросы, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡŽΡ‚ΡΡ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ супСр ΠΊΡ€ΡƒΡ‚ΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΠΈ Ρƒ ΠΊΠΎΠ³ΠΎ Π½Π΅Ρ‚, ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ хочСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·Π±Ρ€Π°Π½Π½Ρ‹ΠΌ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос окруТСния - хочСтся Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊ справится с установкой ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ вСрсии Python ΠΈ всСх Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Π½ΠΎ это Π½Π΅ всСгда простая Π·Π°Π΄Π°Ρ‡Π°. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ». И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, хочСтся,Β  Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ быстрСС, Ρ‡Π΅ΠΌ Π² срСдС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. И Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚ настало врСмя ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Python-ΠΊΠΎΠ΄. МСня Π·ΠΎΠ²ΡƒΡ‚ Руслан, я ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Β«Π¦ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β». БСгодня я расскаТу, ΠΊΠ°ΠΊ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ самый компилятор ΠΈΠ· мноТСства доступных. AOT/JIT ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ – это сборка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π°Ρ: Ρ‚Ρ€Π°Π½ΡΠ»ΡΡ†ΠΈΡŽ всСх ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, написанных Π½Π° языкС программирования высокого уровня, Π² эквивалСнтныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π° Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΌ языкС, Π±Π»ΠΈΠ·ΠΊΠΎΠΌΒ  ΠΊ ΠΌΠ°ΡˆΠΈΠ½Π½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ, ΠΈΠ»ΠΈ Π½Π° машинном языкС ΠΈ сборку исполняСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. БущСствуСт Π΄Π²Π° Π²ΠΈΠ΄Π° компиляции: AOT-компиляция (ahead-of-time) – компиляция ΠΏΠ΅Ρ€Π΅Π΄ исполнСниСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’.Π΅. ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° компилируСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ компиляции получаСтся исполняСмый Ρ„Π°ΠΉΠ». JIT-компиляция (just-in-time) – компиляция Π²ΠΎ врСмя исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’.Π΅. ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° (Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅, Π±Π»ΠΎΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹) компилируСтся ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π· - ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запускС.Β  Π‘Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ†Π΅Π»Π΅ΠΉ являСтся ускорСниС, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ, насколько быстро Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ скомпилированный ΠΊΠΎΠ΄. Π’ качСствС Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ° Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ pyperfomance . К соТалСнию, pyperfomance Π½Π΅ подошСл для Cython ΠΈ Pythran, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ позволяСт Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС возмоТности языка. УскорСния для Cython Π±Π΅Π· ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ, Π° Pythran Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ классы. Для Π½ΠΈΡ… Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ вычислСниСм числа ΠΏΠΈ: def approximate_pi(n): step = 1.0 / n result = 0 for i in range(n): x = (i + 0.5) * step result += 4.0 / (1.0 + x * x) return step * result ЭкспСримСнты Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° процСссорС Intel Core i7 10510U. На CPython 3.9.7 врСмя вычислСния числа ΠΏΠΈ Π΄ΠΎ 100.000.000 Π·Π½Π°ΠΊΠ° заняло 5.82 сСкунды. AOT-компиляция Python PyInstaller PyInstaller ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ прилоТСния Python Π² Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Π΅ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ Π² Windows, GNU / Linux, Mac OS X, FreeBSD, Solaris ΠΈ AIX.Β  УстанавливаСтся Ρ‡Π΅Ρ€Π΅Π· pip: pip install pyinstaller ПослС установки для создания исполняСмого Ρ„Π°ΠΉΠ»Π° достаточно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: pyinstaller <имя_Ρ„Π°ΠΉΠ»Π°>.py Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ создано: *.spec – Ρ„Π°ΠΉΠ» спСцификации (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ускорСния Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… сборок прилоТСния, связи Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ .dll ΠΈ .so Ρ„Π°ΠΉΠ»ΠΎΠ², Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² исполняСмый Ρ„Π°ΠΉΠ» ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² runtime-Π° Python); build/ – дирСктория с ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для сборки исполняСмого Ρ„Π°ΠΉΠ»Π°; dist/ – дирСктория, содСрТащая всС зависимости ΠΈ исполняСмый Ρ„Π°ΠΉΠ». Π‘Π±ΠΎΡ€ΠΊΡƒ прилоТСния ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки: --name – ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρƒ сцСнария); --onefile – созданиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΏΠ°ΠΏΠΊΠ° с зависимостями ΠΈ исполняСмый Ρ„Π°ΠΉΠ»); --hidden-import – пСрСчислСниС ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ PyInstaller Π½Π΅ смог ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ автоматичСски; --add-data – Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² сборку Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…; --add-binary – Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² сборку Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²; --exclude-module – ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈΠ· исполняСмого Ρ„Π°ΠΉΠ»Π°; --key – ΠΊΠ»ΡŽΡ‡ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ AES256. Π”Π°, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ исходного ΠΊΠΎΠ΄Π°, Π½ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ: Pyinstaller Extractor (.exe β†’ .pyc) ΠΈ uncompile6 (.pyc β†’ .py) .Β  Для скрытия исходного ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ„ΡƒΡΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ. Π£ PyInstaller Π΅ΡΡ‚ΡŒ ограничСния. Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Python 3.5–3.9. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ созданиС исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм, Π½ΠΎ Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΡ€ΠΎΡΡΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Ρ‚. Π΅. Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ» для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ОБ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, исполняСмый Ρ„Π°ΠΉΠ» зависит ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ glibc, Ρ‚. Π΅. Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ» для самой старой вСрсии ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ОБ. PyInstaller Π·Π½Π°Π΅Ρ‚ ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Python-ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ… ΠΈ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΈΡ… ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ сборкС исполняСмого Ρ„Π°ΠΉΠ»Π°. Но Π½Π΅ ΠΎ всСх. НапримСр, Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ uvicorn практичСски вСсь Π½ΡƒΠΆΠ½ΠΎ явно ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ», ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° pyinstaller. ΠŸΠΎΠ»Π½Ρ‹ΠΉ список ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ здСсь . Cython Cython - это ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ статичСский компилятор ΠΊΠ°ΠΊ для языка программирования Python, Ρ‚Π°ΠΊ ΠΈ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ языка программирования Cython. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ΄ Π½Π° Python Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π‘ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ, совмСстимый с CPython. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ придСтся Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ систСмы ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ процСссора. Бтавится Cython Ρ‡Π΅Ρ€Π΅Π· pip: pip install Cython Рассмотрим Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с вычислСниСм числа ΠΏΠΈ: НСмного ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ: def approximate_pi(int n): cdef float step cdef float result cdef float x step = 1.0 / n result = 0.0 for i in range(n): x = (i + 0.5) * step result += 4.0 / (1.0 + x * x) return step * result Cython β†’ C: cython -2Β  pi_approximater.pyx -o pi_approximater.c ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Π‘-ΡˆΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄: gcc -g -O2 -shared -o pi_approximater.so pi_approximater.c python-config --includes --ldflags -fPIC И замСряСм врСмя Π½Π° Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ΅: 3,66 сСкунды. А Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли Π² нашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ? Π’ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ сцСнарий сборки. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сборку Π² зависимости ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„Π°ΠΉΠ» build.py: from distutils.core import setup from Cython.Build import cythonize setup( ext_modules=cythonize("bench_cython.pyx"), ) Запустим: python build.py build_ext –-inplace Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрирован .so/.dll Ρ„Π°ΠΉΠ». Nuitka Nuitka способна ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ прилоТСния Python Π² Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Π΅ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Python-ΠΊΠΎΠ΄ Π² Π‘ для Π΅Π³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ компиляции. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ вСрсиями Python (2.6, 2.7, 3.3 - 3.9). Бтавится Ρ‡Π΅Ρ€Π΅Π· pip: pip install nuitka Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π° достаточно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: python -m nuitka --follow-import some_program.py Для компиляции модуля: python -m nuitka --module some_module.py Для компиляции ΠΏΠ°ΠΊΠ΅Ρ‚Π°: python -m nuitka --module some_package --include-package = some_package Pythran Pythran – статичСский компилятор Python, ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ сСбя ΠΊΠ°ΠΊ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π° Π½Π°ΡƒΡ‡Π½Ρ‹Π΅ вычислСния ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ прСимущСства многоядСрных процСссоров ΠΈ Π±Π»ΠΎΠΊΠΎΠ² инструкций SIMD. Он транслируСт Python-ΠΊΠΎΠ΄, Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ описаниями интСрфСйса, Π² C++. Π”ΠΎ вСрсии 0.9.5 (Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ) Pythran ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π» Python 3 ΠΈ Python 2.7. ПослСдниС вСрсии ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Python 3. Установка: pip install pythran Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» <имя Ρ„Π°ΠΉΠ»Π°>.so : pythran <имя Ρ„Π°ΠΉΠ»Π°>.py Pythran ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ классы, поэтому ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΈΡ… компиляции Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½Π° ошибка: Top level statements can only be assignments, strings,functions, comments, or imports Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: #pythran export approximate_pi(int) def approximate_pi(n): step = 1.0 / n result = 0 for i in range(n): x = (i + 0.5) * step result += 4.0 / (1.0 + x * x) return step * result Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ Π²Ρ‹Π΄Π°Π΅Ρ‚ 0,00007 сСкунды. cx-Freeze cx-Freeze – это Π½Π°Π±ΠΎΡ€ скриптов ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ прСобразования скриптов Python Π² исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹. cx_Freeze - кроссплатформСнный. Он ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Python 3.5.2 ΠΈ Π²Ρ‹ΡˆΠ΅. Бтавится с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pip: pip install cx_Freeze Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π° достаточно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: cxfreeze <имя Ρ„Π°ΠΉΠ»Π°>.py Π‘Π±ΠΎΡ€ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки: -h , --help - справка; -O - ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сгСнСрированный Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ согласно PYTHONOPTIMIZE; -c , --compress - ΡΠΆΠ°Ρ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Π² zip-Ρ„Π°ΠΉΠ»Π°Ρ…; -s , --silent - Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прСдупрСТдСния ΠΈ ошибки; --target-dir =DIR, --install-dir =DIR - ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΈ всС зависимыС Ρ„Π°ΠΉΠ»Ρ‹. Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС сцСнария сборки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ: import sys from cx_Freeze import setup, Executable # Dependencies are automatically detected, but it might need fine tuning. build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]} # GUI applications require a different base on Windows (the default is for a # console application). base = None if sys.platform == "win32": base = "Win32GUI" setup( name = "guifoo", version = "0.1", description = "My GUI application!", options = {"build_exe": build_exe_options}, executables = [Executable("guifoo.py", base=base)]) Π‘Π±ΠΎΡ€ΠΊΠ° исполняСмого Ρ„Π°ΠΉΠ»Π°: Β  python setup.py build JIT-компиляция Python JIT-компиляция Π½Π΅ позволяСт ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ исходники ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ», Π½ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. PyPy PyPy - ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ языка программирования Python 2.7 ΠΈ Python 3.7. Он написан Π½Π° RPython ΠΈ содСрТит: компилятор Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΠ΄Π° Python ΠΈΠ· исходного ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ прилоТСния; ΠΎΡ†Π΅Π½Ρ‰ΠΈΠΊ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°, отвСтствСнный Π·Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΠ΄Π° Python; стандартноС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ΅ пространство, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅Π΅ Π·Π° созданиС ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Python, Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. PyPy ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ сотни Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Python, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ NumPy. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ особСнности (сравнСниС с CPython): Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ. ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ тратится Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Python, PyPy ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ваш ΠΊΠΎΠ΄. ИспользованиС памяти. ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Python, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ памяти (нСсколько сотСн Мб ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅), ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ мСньшС мСста, Ρ‡Π΅ΠΌ Π² CPython. Однако это Π½Π΅ всСгда Ρ‚Π°ΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ зависит ΠΎΡ‚ мноТСства Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. Π’Π°ΠΊΠΆΠ΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ потрСблСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π²Ρ‹ΡˆΠ΅, Ρ‡Π΅ΠΌ Ρƒ CPython. Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ PyPy ΠΌΠΎΠΆΠ½ΠΎ с здСсь . ПослС скачивания PyPy Π³ΠΎΡ‚ΠΎΠ² ΠΊ запуску послС распаковки Π°Ρ€Ρ…ΠΈΠ²Π°. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ PyPy доступным для всСй систСмы, достаточно ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ссылку Π½Π° исполняСмый Ρ„Π°ΠΉΠ» pypy Π² /usr/local/bin . Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pyenv . PyPy Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° Mac, Linux (Π½Π΅ всС дистрибутивы) ΠΈΠ»ΠΈ Windows. Для запуска ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PyPy вмСсто ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ python3 (ΠΊΠ°ΠΊ c ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CPython) достаточно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ pypy3 : Β  pypy3 something.py Pyston Pyston - это Ρ„ΠΎΡ€ΠΊ CPython 3.8.8 с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ настоящСС врСмя ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ установку Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· исходников. Или с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pyenv . Π’ Pyston ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ всС возмоТности CPython, Π² Ρ‚ΠΎΠΌ числС C API для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π½Π° языкС Π‘ΠΈ. Π‘Ρ€Π΅Π΄ΠΈ основных ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΉ Pyston ΠΎΡ‚ CPython ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΎΠ±Ρ‰ΠΈΡ… ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ выдСляСтся использованиС DynASM JIT ΠΈ inline-ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ .Β  Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ рассмотрСли 5 Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ² AOT-компиляции Python. Для Π»ΡŽΠ±ΠΈΡ‚Π΅Π»Π΅ΠΉ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ, Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° со ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ. PyInstaller Cython Nuitka Pythran cx-Freeze ГСнСрация Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Ρ… исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² + - + - + ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ python-модуля Π² исполняСмый Ρ„Π°ΠΉΠ», совмСстимый с CPython - + + + + ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Python + - + - + Врансляция Python Π² Π‘/C++ - + + + - ΠšΡ€ΠΎΡΡΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ + + + + + ΠšΡ€ΠΎΡΡΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ - - - - - Π‘Ρ€Π΅Π΄Π½Π΅Π΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя выполнСния ΠΊΠΎΠ΄Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… вСрсиях CPython, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°Ρ… с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ JIT-компиляции ΠΈ послС сборки Π½Π° Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°Ρ… AOT-компиляции: Бписок Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ http://www.pyinstaller.org/ https://cython.org/ https://nuitka.net/ https://github.com/serge-sans-paille/pythran https://cx-freeze.readthedocs.io/en/latest/ https://github.com/pyston/pyston https://www.pypy.org/
Markdown
[ВсС ΠΏΠΎΡ‚ΠΎΠΊΠΈ](https://habr.com/ru/articles/) [Π’ΠΎΠΉΡ‚ΠΈ](https://habr.com/kek/v1/auth/habrahabr/?back=/ru/companies/numdes/articles/581374/&hl=ru) [![](https://habrastorage.org/getpro/habr/company/d42/ce2/110/d42ce21104a442024a88c47bcf45a426.jpg)](https://habr.com/ru/companies/numdes/profile/) [Π¦ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅](https://habr.com/ru/companies/numdes/profile/) Наука ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ 30 ΠŸΠΎΠ΄ΠΏΠΈΡΡ‡ΠΈΠΊΠΈ ΠŸΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ [![](https://habrastorage.org/r/w48/getpro/habr/avatars/8d2/8b6/a2f/8d28b6a2f57e234b64dc164f8639db37.jpg)](https://habr.com/ru/users/NumDes/) [NumDes](https://habr.com/ru/users/NumDes/) 6 ΠΎΠΊΡ‚ 2021 Π² 12:56 # ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Python 7 ΠΌΠΈΠ½ 123K [Π‘Π»ΠΎΠ³ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π¦ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅](https://habr.com/ru/companies/numdes/articles/)[ВысоконагруТСнныС систСмы \*](https://habr.com/ru/hubs/hi/) [Python \*](https://habr.com/ru/hubs/python/) [ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ \*](https://habr.com/ru/hubs/programming/) [ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρ‹ \*](https://habr.com/ru/hubs/compilers/) ![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/991/60e/aaf/99160eaaf94489fa7c74a354f7dc1513.png) ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π½Π° Python ΠΈ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅ΡΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ / Π΅Ρ‘ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΡƒ. И Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ вопросы, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡŽΡ‚ΡΡ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ супСр ΠΊΡ€ΡƒΡ‚ΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΠΈ Ρƒ ΠΊΠΎΠ³ΠΎ Π½Π΅Ρ‚, ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ хочСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·Π±Ρ€Π°Π½Π½Ρ‹ΠΌ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос окруТСния - хочСтся Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊ справится с установкой ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ вСрсии Python ΠΈ всСх Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Π½ΠΎ это Π½Π΅ всСгда простая Π·Π°Π΄Π°Ρ‡Π°. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ». И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, хочСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ быстрСС, Ρ‡Π΅ΠΌ Π² срСдС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. И Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚ настало врСмя ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Python-ΠΊΠΎΠ΄. МСня Π·ΠΎΠ²ΡƒΡ‚ Руслан, я ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Β«Π¦ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β». БСгодня я расскаТу, ΠΊΠ°ΠΊ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ самый компилятор ΠΈΠ· мноТСства доступных. ## AOT/JIT ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ – это сборка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π°Ρ: Ρ‚Ρ€Π°Π½ΡΠ»ΡΡ†ΠΈΡŽ всСх ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, написанных Π½Π° языкС программирования высокого уровня, Π² эквивалСнтныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π° Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΌ языкС, Π±Π»ΠΈΠ·ΠΊΠΎΠΌ ΠΊ ΠΌΠ°ΡˆΠΈΠ½Π½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ, ΠΈΠ»ΠΈ Π½Π° машинном языкС ΠΈ сборку исполняСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. БущСствуСт Π΄Π²Π° Π²ΠΈΠ΄Π° компиляции: - **AOT-компиляция (ahead-of-time)** – компиляция ΠΏΠ΅Ρ€Π΅Π΄ исполнСниСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’.Π΅. ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° компилируСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ компиляции получаСтся исполняСмый Ρ„Π°ΠΉΠ». - **JIT-компиляция (just-in-time)** – компиляция Π²ΠΎ врСмя исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’.Π΅. ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° (Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅, Π±Π»ΠΎΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹) компилируСтся ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π· - ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запускС. ## Π‘Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ†Π΅Π»Π΅ΠΉ являСтся ускорСниС, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ, насколько быстро Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ скомпилированный ΠΊΠΎΠ΄. Π’ качСствС Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ° Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ [pyperfomance](https://pyperformance.readthedocs.io/). К соТалСнию, pyperfomance Π½Π΅ подошСл для Cython ΠΈ Pythran, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ позволяСт Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС возмоТности языка. УскорСния для Cython Π±Π΅Π· ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ, Π° Pythran Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ классы. Для Π½ΠΈΡ… Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ вычислСниСм числа ΠΏΠΈ: ``` ``` ЭкспСримСнты Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° процСссорС Intel Core i7 10510U. На CPython 3.9.7 врСмя вычислСния числа ΠΏΠΈ Π΄ΠΎ 100.000.000 Π·Π½Π°ΠΊΠ° заняло 5.82 сСкунды. ## AOT-компиляция Python **PyInstaller** PyInstaller ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ прилоТСния Python Π² Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Π΅ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ Π² Windows, GNU / Linux, Mac OS X, FreeBSD, Solaris ΠΈ AIX. УстанавливаСтся Ρ‡Π΅Ρ€Π΅Π· pip: `pip install pyinstaller` ПослС установки для создания исполняСмого Ρ„Π°ΠΉΠ»Π° достаточно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: `pyinstaller <имя_Ρ„Π°ΠΉΠ»Π°>.py` Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ создано: - **\*.spec** – Ρ„Π°ΠΉΠ» спСцификации (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ускорСния Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… сборок прилоТСния, связи Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ .dll ΠΈ .so Ρ„Π°ΠΉΠ»ΠΎΠ², Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² исполняСмый Ρ„Π°ΠΉΠ» ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² runtime-Π° Python); - **build/** – дирСктория с ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для сборки исполняСмого Ρ„Π°ΠΉΠ»Π°; - **dist/** – дирСктория, содСрТащая всС зависимости ΠΈ исполняСмый Ρ„Π°ΠΉΠ». Π‘Π±ΠΎΡ€ΠΊΡƒ прилоТСния ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки: - **\--name** – ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρƒ сцСнария); - **\--onefile** – созданиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΏΠ°ΠΏΠΊΠ° с зависимостями ΠΈ исполняСмый Ρ„Π°ΠΉΠ»); - **\--hidden-import** – пСрСчислСниС ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ PyInstaller Π½Π΅ смог ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ автоматичСски; - **\--add-data** – Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² сборку Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…; - **\--add-binary** – Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² сборку Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²; - **\--exclude-module** – ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈΠ· исполняСмого Ρ„Π°ΠΉΠ»Π°; - **\--key** – ΠΊΠ»ΡŽΡ‡ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ AES256. Π”Π°, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ исходного ΠΊΠΎΠ΄Π°, Π½ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ: **Pyinstaller Extractor (.exe β†’ .pyc)** ΠΈ **uncompile6 (.pyc β†’ .py)**. Для скрытия исходного ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ„ΡƒΡΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ. Π£ PyInstaller Π΅ΡΡ‚ΡŒ ограничСния. Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Python 3.5–3.9. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ созданиС исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм, Π½ΠΎ Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΡ€ΠΎΡΡΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Ρ‚. Π΅. Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ» для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ОБ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, исполняСмый Ρ„Π°ΠΉΠ» зависит ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ glibc, Ρ‚. Π΅. Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ» для самой старой вСрсии ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ОБ. PyInstaller Π·Π½Π°Π΅Ρ‚ ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Python-ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ… ΠΈ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΈΡ… ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ сборкС исполняСмого Ρ„Π°ΠΉΠ»Π°. Но Π½Π΅ ΠΎ всСх. НапримСр, Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ **uvicorn** практичСски вСсь Π½ΡƒΠΆΠ½ΠΎ явно ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ», ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° pyinstaller. ΠŸΠΎΠ»Π½Ρ‹ΠΉ список ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ [здСсь](https://github.com/pyinstaller/pyinstaller/wiki/Supported-Packages). **Cython** Cython - это ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ статичСский компилятор ΠΊΠ°ΠΊ для языка программирования Python, Ρ‚Π°ΠΊ ΠΈ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ языка программирования Cython. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ΄ Π½Π° Python Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π‘ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ, совмСстимый с CPython. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ придСтся Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ систСмы ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ процСссора. Бтавится Cython Ρ‡Π΅Ρ€Π΅Π· pip: `pip install Cython` Рассмотрим Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с вычислСниСм числа ΠΏΠΈ: 1. ***НСмного ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:*** ``` ``` 2. ***Cython β†’ C:*** `cython -2Β  pi_approximater.pyx -o pi_approximater.c` 3. ***ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Π‘-ΡˆΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄:*** `gcc -g -O2 -shared -o pi_approximater.so pi_approximater.c python-config --includes --ldflags -fPIC` 4. ***И замСряСм врСмя Π½Π° Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ΅:*** 3,66 сСкунды. А Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли Π² нашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ? Π’ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ сцСнарий сборки. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сборку Π² зависимости ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„Π°ΠΉΠ» build.py: ``` ``` Запустим: `python build.py build_ext –-inplace` Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрирован **.so/.dll** Ρ„Π°ΠΉΠ». **Nuitka** Nuitka способна ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ прилоТСния Python Π² Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Π΅ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Python-ΠΊΠΎΠ΄ Π² Π‘ для Π΅Π³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ компиляции. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ вСрсиями Python (2.6, 2.7, 3.3 - 3.9). Бтавится Ρ‡Π΅Ρ€Π΅Π· pip: `pip install nuitka` Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π° достаточно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: `python -m nuitka --follow-import some_program.py` Для компиляции модуля: `python -m nuitka --module some_module.py` Для компиляции ΠΏΠ°ΠΊΠ΅Ρ‚Π°: `python -m nuitka --module some_package --include-package = some_package` **Pythran** Pythran – статичСский компилятор Python, ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ сСбя ΠΊΠ°ΠΊ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π° Π½Π°ΡƒΡ‡Π½Ρ‹Π΅ вычислСния ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ прСимущСства многоядСрных процСссоров ΠΈ Π±Π»ΠΎΠΊΠΎΠ² инструкций SIMD. Он транслируСт Python-ΠΊΠΎΠ΄, Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ описаниями интСрфСйса, Π² C++. Π”ΠΎ вСрсии 0.9.5 (Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ) Pythran ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π» Python 3 ΠΈ Python 2.7. ПослСдниС вСрсии ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Python 3. Установка: `pip install pythran` Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» **\<имя Ρ„Π°ΠΉΠ»Π°\>.so**: `pythran <имя Ρ„Π°ΠΉΠ»Π°>.py` Pythran ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ классы, поэтому ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΈΡ… компиляции Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½Π° ошибка: > ***Top level statements can only be assignments, strings,functions, comments, or imports*** Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: ``` ``` Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ Π²Ρ‹Π΄Π°Π΅Ρ‚ 0,00007 сСкунды. **cx-Freeze** cx-Freeze – это Π½Π°Π±ΠΎΡ€ скриптов ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ прСобразования скриптов Python Π² исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹. cx\_Freeze - кроссплатформСнный. Он ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Python 3.5.2 ΠΈ Π²Ρ‹ΡˆΠ΅. Бтавится с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pip: `pip install cx_Freeze` Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π° достаточно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: `cxfreeze <имя Ρ„Π°ΠΉΠ»Π°>.py` Π‘Π±ΠΎΡ€ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки: - **\-h**, **\--help** - справка; - **\-O** - ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сгСнСрированный Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ согласно PYTHONOPTIMIZE; - **\-c**, **\--compress** - ΡΠΆΠ°Ρ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Π² zip-Ρ„Π°ΠΉΠ»Π°Ρ…; - **\-s**, **\--silent** - Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прСдупрСТдСния ΠΈ ошибки; - **\--target-dir**\=DIR, **\--install-dir**\=DIR - ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΈ всС зависимыС Ρ„Π°ΠΉΠ»Ρ‹. Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС сцСнария сборки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ: ``` ``` Π‘Π±ΠΎΡ€ΠΊΠ° исполняСмого Ρ„Π°ΠΉΠ»Π°: `python setup.py build` ## JIT-компиляция Python JIT-компиляция Π½Π΅ позволяСт ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ исходники ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ», Π½ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. **PyPy** PyPy - ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ языка программирования Python 2.7 ΠΈ Python 3.7. Он написан Π½Π° RPython ΠΈ содСрТит: - компилятор Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΠ΄Π° Python ΠΈΠ· исходного ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ прилоТСния; - ΠΎΡ†Π΅Π½Ρ‰ΠΈΠΊ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°, отвСтствСнный Π·Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΠ΄Π° Python; - стандартноС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ΅ пространство, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅Π΅ Π·Π° созданиС ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Python, Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. PyPy ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ сотни Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Python, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ NumPy. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ особСнности (сравнСниС с CPython): - **Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ.** ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ тратится Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Python, PyPy ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ваш ΠΊΠΎΠ΄. - **ИспользованиС памяти.** ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Python, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ памяти (нСсколько сотСн Мб ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅), ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ мСньшС мСста, Ρ‡Π΅ΠΌ Π² CPython. Однако это Π½Π΅ всСгда Ρ‚Π°ΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ зависит ΠΎΡ‚ мноТСства Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. Π’Π°ΠΊΠΆΠ΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ потрСблСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π²Ρ‹ΡˆΠ΅, Ρ‡Π΅ΠΌ Ρƒ CPython. Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ PyPy ΠΌΠΎΠΆΠ½ΠΎ с [здСсь](https://www.pypy.org/download.html). ПослС скачивания PyPy Π³ΠΎΡ‚ΠΎΠ² ΠΊ запуску послС распаковки Π°Ρ€Ρ…ΠΈΠ²Π°. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ PyPy доступным для всСй систСмы, достаточно ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ссылку Π½Π° исполняСмый Ρ„Π°ΠΉΠ» pypy Π² **/usr/local/bin**. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ **pyenv**. PyPy Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° Mac, Linux (Π½Π΅ всС дистрибутивы) ΠΈΠ»ΠΈ Windows. Для запуска ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PyPy вмСсто ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ **python3** (ΠΊΠ°ΠΊ c ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CPython) достаточно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ **pypy3**: `pypy3 something.py` **Pyston** Pyston - это Ρ„ΠΎΡ€ΠΊ CPython 3.8.8 с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ настоящСС врСмя ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ установку Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· исходников. Или с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ **pyenv**. Π’ Pyston ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ всС возмоТности CPython, Π² Ρ‚ΠΎΠΌ числС C API для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π½Π° языкС Π‘ΠΈ. Π‘Ρ€Π΅Π΄ΠΈ основных ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΉ Pyston ΠΎΡ‚ CPython ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΎΠ±Ρ‰ΠΈΡ… ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ выдСляСтся использованиС[DynASM JIT](https://luajit.org/dynasm.html) ΠΈ[inline-ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ](https://bugs.python.org/issue14757). ## Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ рассмотрСли 5 Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ² AOT-компиляции Python. Для Π»ΡŽΠ±ΠΈΡ‚Π΅Π»Π΅ΠΉ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ, Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° со ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ. | | | | | | | |---|---|---|---|---|---| | | **PyInstaller** | **Cython** | **Nuitka** | **Pythran** | **cx-Freeze** | | ГСнСрация Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Ρ… исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² | \+ | \- | \+ | \- | \+ | | ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ python-модуля Π² исполняСмый Ρ„Π°ΠΉΠ», совмСстимый с CPython | \- | \+ | \+ | \+ | \+ | | ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Python | \+ | \- | \+ | \- | \+ | | Врансляция Python Π² Π‘/C++ | \- | \+ | \+ | \+ | \- | | ΠšΡ€ΠΎΡΡΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ | \+ | \+ | \+ | \+ | \+ | | ΠšΡ€ΠΎΡΡΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ | \- | \- | \- | \- | \- | Π‘Ρ€Π΅Π΄Π½Π΅Π΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя выполнСния ΠΊΠΎΠ΄Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… вСрсиях CPython, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°Ρ… с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ JIT-компиляции ΠΈ послС сборки Π½Π° Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°Ρ… AOT-компиляции: ![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/579/021/08d/57902108df33a9aa3734859ab9df7f0a.jpg) ![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/350/a5c/2a9/350a5c2a95414192fa578eaf40b10f33.png) ## Бписок Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ 1. [http://www.pyinstaller.org/](http://www.pyinstaller.org/) 2. [https://cython.org/](https://cython.org/) 3. [https://nuitka.net/](https://nuitka.net/) 4. [https://github.com/serge-sans-paille/pythran](https://github.com/serge-sans-paille/pythran) 5. [https://cx-freeze.readthedocs.io/en/latest/](https://cx-freeze.readthedocs.io/en/latest/) 6. [https://github.com/pyston/pyston](https://github.com/pyston/pyston) 7. [https://www.pypy.org/](https://www.pypy.org/) Π’Π΅Π³ΠΈ: - [python](https://habr.com/ru/search/?target_type=posts&order=relevance&q=[python]) - [jit-компилятор](https://habr.com/ru/search/?target_type=posts&order=relevance&q=[jit-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B8%D0%BB%D1%8F%D1%82%D0%BE%D1%80]) - [aot](https://habr.com/ru/search/?target_type=posts&order=relevance&q=[aot]) - [pyinstaller](https://habr.com/ru/search/?target_type=posts&order=relevance&q=[pyinstaller]) - [cython](https://habr.com/ru/search/?target_type=posts&order=relevance&q=[cython]) - [nuitka](https://habr.com/ru/search/?target_type=posts&order=relevance&q=[nuitka]) - [cx\_freeze](https://habr.com/ru/search/?target_type=posts&order=relevance&q=[cx_freeze]) - [pypy](https://habr.com/ru/search/?target_type=posts&order=relevance&q=[pypy]) Π₯Π°Π±Ρ‹: - [Π‘Π»ΠΎΠ³ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Π¦ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅](https://habr.com/ru/companies/numdes/articles/) - [ВысоконагруТСнныС систСмы](https://habr.com/ru/hubs/hi/) - [Python](https://habr.com/ru/hubs/python/) - [ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅](https://habr.com/ru/hubs/programming/) - [ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€Ρ‹](https://habr.com/ru/hubs/compilers/) \+10 194 [21](https://habr.com/ru/companies/numdes/articles/581374/comments/) [![](https://habrastorage.org/getpro/habr/company/d42/ce2/110/d42ce21104a442024a88c47bcf45a426.jpg)](https://habr.com/ru/companies/numdes/profile/) [Π¦ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅](https://habr.com/ru/companies/numdes/profile/) Наука ΠΈ Ρ‚Π΅Ρ…Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ [Π‘Π°ΠΉΡ‚](https://numdes.com/)[Π₯Π°Π±Ρ€ ΠšΠ°Ρ€ΡŒΠ΅Ρ€Π°](https://career.habr.com/companies/numdes)[Π’ΠšΠΎΠ½Ρ‚Π°ΠΊΡ‚Π΅](https://vk.com/numdes)[Instagram](https://instagram.com/numdesgn) [![](https://habrastorage.org/getpro/habr/avatars/8d2/8b6/a2f/8d28b6a2f57e234b64dc164f8639db37.jpg)](https://habr.com/ru/users/NumDes/) 5 ΠšΠ°Ρ€ΠΌΠ° Π¦ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅[@NumDes](https://habr.com/ru/users/NumDes/) ΠŸΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ ΠŸΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π₯Π°Π±Ρ€ доступСн 24/7 благодаря ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ Π΄Ρ€ΡƒΠ·Π΅ΠΉ ![Π₯Π°Π±Ρ€ ΠšΠ°Ρ€ΡŒΠ΅Ρ€Π° ΠšΡƒΡ€ΡΡ‹](https://habrastorage.org/webt/qq/ey/pn/qqeypn-py71suynxbusbakjdfjw.png) Π₯Π°Π±Ρ€ ΠšΡƒΡ€ΡΡ‹ для всСх Π Π•ΠšΠ›ΠΠœΠ ΠŸΡ€Π°ΠΊΡ‚ΠΈΠΊΡƒΠΌ, Π₯СкслСт, SkyPro, авторскиС курсы β€” собрали всСх ΠΈ попросили скидки. ΠžΡΡ‚Π°Π»ΠΎΡΡŒ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ\! [ΠŸΠ΅Ρ€Π΅ΠΉΡ‚ΠΈ](https://career.habr.com/courses/?erid=2VSb5wDLYUH&utm_source=habr&utm_medium=sponsorship_hub) [ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ 21](https://habr.com/ru/companies/numdes/articles/581374/comments/) ## ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π›ΡƒΡ‡ΡˆΠΈΠ΅ Π·Π° сутки ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ## Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ Π‘Π°ΠΉΡ‚ [numdes.com](https://numdes.com/) Π”Π°Ρ‚Π° рСгистрации 24 августа 2021 Π§ΠΈΡΠ»Π΅Π½Π½ΠΎΡΡ‚ΡŒ 51–100 Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ ΠœΠ΅ΡΡ‚ΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Россия Π’Π°Ρˆ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ - [Π’ΠΎΠΉΡ‚ΠΈ](https://habr.com/kek/v1/auth/habrahabr/?back=/ru/companies/numdes/articles/581374/&hl=ru) - [РСгистрация](https://habr.com/kek/v1/auth/habrahabr-register/?back=/ru/companies/numdes/articles/581374/&hl=ru) Π Π°Π·Π΄Π΅Π»Ρ‹ - [Π‘Ρ‚Π°Ρ‚ΡŒΠΈ](https://habr.com/ru/articles/) - [Новости](https://habr.com/ru/news/) - [Π₯Π°Π±Ρ‹](https://habr.com/ru/hubs/) - [Компании](https://habr.com/ru/companies/) - [Авторы](https://habr.com/ru/users/) - [ΠŸΠ΅ΡΠΎΡ‡Π½ΠΈΡ†Π°](https://habr.com/ru/sandbox/) Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ - [Устройство сайта](https://habr.com/ru/docs/help/) - [Для Π°Π²Ρ‚ΠΎΡ€ΠΎΠ²](https://habr.com/ru/docs/authors/codex/) - [Для ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΉ](https://habr.com/ru/docs/companies/corpblogs/) - [Π”ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Ρ‹](https://habr.com/ru/docs/docs/transparency/) - [БоглашСниС](https://account.habr.com/info/agreement/?hl=ru_RU) - [ΠšΠΎΠ½Ρ„ΠΈΠ΄Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ](https://account.habr.com/info/confidential/?hl=ru_RU) Услуги - [ΠšΠΎΡ€ΠΏΠΎΡ€Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Π±Π»ΠΎΠ³](https://company.habr.com/ru/corporate-blogs/) - [МСдийная Ρ€Π΅ΠΊΠ»Π°ΠΌΠ°](https://company.habr.com/ru/advertising/) - [НативныС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹](https://company.habr.com/ru/native-special/) - [ΠžΠ±Ρ€Π°Π·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹](https://company.habr.com/ru/education-programs/) - [Π‘Ρ‚Π°Ρ€Ρ‚Π°ΠΏΠ°ΠΌ](https://company.habr.com/ru/hello-startup/) Настройка языка [ВСхничСская ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°](https://habr.com/ru/feedback/) Β© 2006–2026, [Habr](https://company.habr.com/)
Readable Markdown
![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/991/60e/aaf/99160eaaf94489fa7c74a354f7dc1513.png) ΠŸΡ€Π΅Π΄ΠΏΠΎΠ»ΠΎΠΆΠΈΠΌ, Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ Π½Π° Python ΠΈ ΡƒΠΆΠ΅ Π³ΠΎΡ‚ΠΎΠ²ΠΈΡ‚Π΅ΡΡŒ ΠΏΠ΅Ρ€Π΅Π΄Π°Ρ‚ΡŒ Π΅Π³ΠΎ / Π΅Ρ‘ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊΡƒ. И Π² этот ΠΌΠΎΠΌΠ΅Π½Ρ‚ Π²ΠΎΠ·Π½ΠΈΠΊΠ°ΡŽΡ‚ вопросы, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Π΄Π°ΠΆΠ΅ Π½Π΅ Π·Π°Π΄ΡƒΠΌΡ‹Π²Π°ΡŽΡ‚ΡΡ. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΌΠΎΠΆΠ΅Ρ‚ ΠΎΠΊΠ°Π·Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΈ супСр ΠΊΡ€ΡƒΡ‚ΠΎΠΉ Π°Π»Π³ΠΎΡ€ΠΈΡ‚ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π½ΠΈ Ρƒ ΠΊΠΎΠ³ΠΎ Π½Π΅Ρ‚, ΠΈ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ Π΅Π³ΠΎ хочСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ·Π±Ρ€Π°Π½Π½Ρ‹ΠΌ. Π’ΠΎ-Π²Ρ‚ΠΎΡ€Ρ‹Ρ…, Π²ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ вопрос окруТСния - хочСтся Π±Ρ‹Ρ‚ΡŒ ΡƒΠ²Π΅Ρ€Π΅Π½Π½Ρ‹ΠΌ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΊΠ°Π·Ρ‡ΠΈΠΊ справится с установкой ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ вСрсии Python ΠΈ всСх Π²ΡΠΏΠΎΠΌΠΎΠ³Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, Π½ΠΎ это Π½Π΅ всСгда простая Π·Π°Π΄Π°Ρ‡Π°. Π‘Ρ‹Π»ΠΎ Π±Ρ‹ ΡƒΠ΄ΠΎΠ±Π½ΠΎ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ». И, Π½Π°ΠΊΠΎΠ½Π΅Ρ†, хочСтся, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ быстрСС, Ρ‡Π΅ΠΌ Π² срСдС Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. И Π²ΠΎΡ‚ Ρ‚ΡƒΡ‚ настало врСмя ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Python-ΠΊΠΎΠ΄. МСня Π·ΠΎΠ²ΡƒΡ‚ Руслан, я ΡΡ‚Π°Ρ€ΡˆΠΈΠΉ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Β«Π¦ΠΈΡ„Ρ€ΠΎΠ²ΠΎΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅Β». БСгодня я расскаТу, ΠΊΠ°ΠΊ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ Ρ‚ΠΎΡ‚ самый компилятор ΠΈΠ· мноТСства доступных. ## AOT/JIT ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ – это сборка ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, Π²ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‰Π°Ρ: Ρ‚Ρ€Π°Π½ΡΠ»ΡΡ†ΠΈΡŽ всСх ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹, написанных Π½Π° языкС программирования высокого уровня, Π² эквивалСнтныС ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹Π΅ ΠΌΠΎΠ΄ΡƒΠ»ΠΈ Π½Π° Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²ΠΎΠΌ языкС, Π±Π»ΠΈΠ·ΠΊΠΎΠΌ ΠΊ ΠΌΠ°ΡˆΠΈΠ½Π½ΠΎΠΌΡƒ ΠΊΠΎΠ΄Ρƒ, ΠΈΠ»ΠΈ Π½Π° машинном языкС ΠΈ сборку исполняСмой ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. БущСствуСт Π΄Π²Π° Π²ΠΈΠ΄Π° компиляции: - **AOT-компиляция (ahead-of-time)** – компиляция ΠΏΠ΅Ρ€Π΅Π΄ исполнСниСм ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’.Π΅. ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° компилируСтся ΠΎΠ΄ΠΈΠ½ Ρ€Π°Π·, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ компиляции получаСтся исполняСмый Ρ„Π°ΠΉΠ». - **JIT-компиляция (just-in-time)** – компиляция Π²ΠΎ врСмя исполнСния ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’.Π΅. ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ° (Π° Ρ‚ΠΎΡ‡Π½Π΅Π΅, Π±Π»ΠΎΠΊΠΈ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹) компилируСтся ΠΌΠ½ΠΎΠ³ΠΎ Ρ€Π°Π· - ΠΏΡ€ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΌ запускС. ## Π‘Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Ρ†Π΅Π»Π΅ΠΉ являСтся ускорСниС, Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΎΡ†Π΅Π½ΠΈΡ‚ΡŒ, насколько быстро Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ скомпилированный ΠΊΠΎΠ΄. Π’ качСствС Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ° Π±ΡƒΠ΄Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ [pyperfomance](https://pyperformance.readthedocs.io/). К соТалСнию, pyperfomance Π½Π΅ подошСл для Cython ΠΈ Pythran, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ позволяСт Π²ΠΈΠ·ΡƒΠ°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС возмоТности языка. УскорСния для Cython Π±Π΅Π· ΠΌΠΎΠ΄ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ, Π° Pythran Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ классы. Для Π½ΠΈΡ… Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ вычислСниСм числа ΠΏΠΈ: ``` def approximate_pi(n): step = 1.0 / n result = 0 for i in range(n): x = (i + 0.5) * step result += 4.0 / (1.0 + x * x) return step * result ``` ЭкспСримСнты Π±ΡƒΠ΄Π΅ΠΌ ΠΏΡ€ΠΎΠ²ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π° процСссорС Intel Core i7 10510U. На CPython 3.9.7 врСмя вычислСния числа ΠΏΠΈ Π΄ΠΎ 100.000.000 Π·Π½Π°ΠΊΠ° заняло 5.82 сСкунды. ## AOT-компиляция Python **PyInstaller** PyInstaller ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ прилоТСния Python Π² Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Π΅ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹ Π² Windows, GNU / Linux, Mac OS X, FreeBSD, Solaris ΠΈ AIX. УстанавливаСтся Ρ‡Π΅Ρ€Π΅Π· pip: `pip install pyinstaller` ПослС установки для создания исполняСмого Ρ„Π°ΠΉΠ»Π° достаточно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: `pyinstaller <имя_Ρ„Π°ΠΉΠ»Π°>.py` Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ создано: - **\*.spec** – Ρ„Π°ΠΉΠ» спСцификации (ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ускорСния Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… сборок прилоТСния, связи Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ… с ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ, для Π²ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ .dll ΠΈ .so Ρ„Π°ΠΉΠ»ΠΎΠ², Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² исполняСмый Ρ„Π°ΠΉΠ» ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² runtime-Π° Python); - **build/** – дирСктория с ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹ΠΌΠΈ для сборки исполняСмого Ρ„Π°ΠΉΠ»Π°; - **dist/** – дирСктория, содСрТащая всС зависимости ΠΈ исполняСмый Ρ„Π°ΠΉΠ». Π‘Π±ΠΎΡ€ΠΊΡƒ прилоТСния ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки: - **\--name** – ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΠΈΠΌΠ΅Π½ΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Ρ‚Π°ΠΊΠΎΠ΅ ΠΆΠ΅, ΠΊΠ°ΠΊ Ρƒ сцСнария); - **\--onefile** – созданиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ исполняСмого Ρ„Π°ΠΉΠ»Π° (ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, ΠΏΠ°ΠΏΠΊΠ° с зависимостями ΠΈ исполняСмый Ρ„Π°ΠΉΠ»); - **\--hidden-import** – пСрСчислСниС ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ PyInstaller Π½Π΅ смог ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΡ‚ΡŒ автоматичСски; - **\--add-data** – Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² сборку Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄Π°Π½Π½Ρ‹Ρ…; - **\--add-binary** – Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π² сборку Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²; - **\--exclude-module** – ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ ΠΈΠ· исполняСмого Ρ„Π°ΠΉΠ»Π°; - **\--key** – ΠΊΠ»ΡŽΡ‡ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ AES256. Π”Π°, ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ исходного ΠΊΠΎΠ΄Π°, Π½ΠΎ Π΅Π³ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π΄Π΅ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ: **Pyinstaller Extractor (.exe β†’ .pyc)** ΠΈ **uncompile6 (.pyc β†’ .py)**. Для скрытия исходного ΠΊΠΎΠ΄Π° ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ„ΡƒΡΡ†ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Python с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΡˆΠΈΡ„Ρ€ΠΎΠ²Π°Π½ΠΈΡ. Π£ PyInstaller Π΅ΡΡ‚ΡŒ ограничСния. Он Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Python 3.5–3.9. ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ созданиС исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² для Ρ€Π°Π·Π½Ρ‹Ρ… ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Ρ… систСм, Π½ΠΎ Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡ‚ΡŒ ΠΊΡ€ΠΎΡΡΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Ρ‚. Π΅. Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ» для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ОБ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎ. Π‘ΠΎΠ»Π΅Π΅ Ρ‚ΠΎΠ³ΠΎ, исполняСмый Ρ„Π°ΠΉΠ» зависит ΠΎΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ glibc, Ρ‚. Π΅. Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ исполняСмый Ρ„Π°ΠΉΠ» для самой старой вСрсии ΠΊΠ°ΠΆΠ΄ΠΎΠΉ ОБ. PyInstaller Π·Π½Π°Π΅Ρ‚ ΠΎ ΠΌΠ½ΠΎΠ³ΠΈΡ… Python-ΠΏΠ°ΠΊΠ΅Ρ‚Π°Ρ… ΠΈ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΈΡ… ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΏΡ€ΠΈ сборкС исполняСмого Ρ„Π°ΠΉΠ»Π°. Но Π½Π΅ ΠΎ всСх. НапримСр, Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊ **uvicorn** практичСски вСсь Π½ΡƒΠΆΠ½ΠΎ явно ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ„Π°ΠΉΠ», ΠΊ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌΡƒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΈΠΌΠ΅Π½Π΅Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄Π° pyinstaller. ΠŸΠΎΠ»Π½Ρ‹ΠΉ список ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠ² ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ [здСсь](https://github.com/pyinstaller/pyinstaller/wiki/Supported-Packages). **Cython** Cython - это ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ статичСский компилятор ΠΊΠ°ΠΊ для языка программирования Python, Ρ‚Π°ΠΊ ΠΈ для Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½ΠΎΠ³ΠΎ языка программирования Cython. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΊΠΎΠ΄ Π½Π° Python Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π‘ ΠΈ Π·Π°Ρ‚Π΅ΠΌ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Π±ΠΈΠ½Π°Ρ€Π½ΠΈΠΊ, совмСстимый с CPython. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ придСтся Π΄Π΅Π»Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ всС ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹Π΅ систСмы ΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ процСссора. Бтавится Cython Ρ‡Π΅Ρ€Π΅Π· pip: `pip install Cython` Рассмотрим Π΅Π³ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π½Π° ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с вычислСниСм числа ΠΏΠΈ: 1. ***НСмного ΠΌΠΎΠ΄ΠΈΡ„ΠΈΡ†ΠΈΡ€ΡƒΠ΅ΠΌ Π½Π°ΡˆΡƒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ:*** ``` def approximate_pi(int n): cdef float step cdef float result cdef float x step = 1.0 / n result = 0.0 for i in range(n): x = (i + 0.5) * step result += 4.0 / (1.0 + x * x) return step * result ``` 2. ***Cython β†’ C:*** `cython -2Β  pi_approximater.pyx -o pi_approximater.c` 3. ***ΠšΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Π‘-ΡˆΠ½Ρ‹ΠΉ ΠΊΠΎΠ΄:*** `gcc -g -O2 -shared -o pi_approximater.so pi_approximater.c python-config --includes --ldflags -fPIC` 4. ***И замСряСм врСмя Π½Π° Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ΅:*** 3,66 сСкунды. А Ρ‡Ρ‚ΠΎ Π΄Π΅Π»Π°Ρ‚ΡŒ, Ссли Π² нашСм ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΡƒΠΆΠ½ΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ? Π’ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡ‹ΠΉ сцСнарий сборки. Π‘ Π΅Π³ΠΎ ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΌΠΎΠΆΠ½ΠΎ ΠΌΠΎΠ΄Π΅Ρ€Π½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сборку Π² зависимости ΠΎΡ‚ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ систСмы, ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ нСсколько Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ, ΠΈ ΠΌΠ½ΠΎΠ³ΠΎΠ΅ Π΄Ρ€ΡƒΠ³ΠΎΠ΅. Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ Ρ„Π°ΠΉΠ» build.py: ``` from distutils.core import setup from Cython.Build import cythonize setup( ext_modules=cythonize("bench_cython.pyx"), ) ``` Запустим: `python build.py build_ext –-inplace` Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ Π±ΡƒΠ΄Π΅Ρ‚ сгСнСрирован **.so/.dll** Ρ„Π°ΠΉΠ». **Nuitka** Nuitka способна ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ прилоТСния Python Π² Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Π΅ исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹, Π° Ρ‚Π°ΠΊΠΆΠ΅ Ρ‚Ρ€Π°Π½ΡΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Python-ΠΊΠΎΠ΄ Π² Π‘ для Π΅Π³ΠΎ ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ компиляции. Π Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с Ρ€Π°Π·Π½Ρ‹ΠΌΠΈ вСрсиями Python (2.6, 2.7, 3.3 - 3.9). Бтавится Ρ‡Π΅Ρ€Π΅Π· pip: `pip install nuitka` Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π° достаточно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: `python -m nuitka --follow-import some_program.py` Для компиляции модуля: `python -m nuitka --module some_module.py` Для компиляции ΠΏΠ°ΠΊΠ΅Ρ‚Π°: `python -m nuitka --module some_package --include-package = some_package` **Pythran** Pythran – статичСский компилятор Python, ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ сСбя ΠΊΠ°ΠΊ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Π½Π° Π½Π°ΡƒΡ‡Π½Ρ‹Π΅ вычислСния ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰ΠΈΠΉ прСимущСства многоядСрных процСссоров ΠΈ Π±Π»ΠΎΠΊΠΎΠ² инструкций SIMD. Он транслируСт Python-ΠΊΠΎΠ΄, Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ описаниями интСрфСйса, Π² C++. Π”ΠΎ вСрсии 0.9.5 (Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ) Pythran ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π» Python 3 ΠΈ Python 2.7. ПослСдниС вСрсии ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Python 3. Установка: `pip install pythran` Π“Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅ΠΌ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» **\<имя Ρ„Π°ΠΉΠ»Π°\>.so**: `pythran <имя Ρ„Π°ΠΉΠ»Π°>.py` Pythran ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ Π½Π΅ ΡƒΠΌΠ΅Π΅Ρ‚ Π² ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΈΠ΅ классы, поэтому ΠΏΡ€ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚ΠΊΠ΅ ΠΈΡ… компиляции Π±ΡƒΠ΄Π΅Ρ‚ Π²Ρ‹Π±Ρ€ΠΎΡˆΠ΅Π½Π° ошибка: > ***Top level statements can only be assignments, strings,functions, comments, or imports*** Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ: ``` #pythran export approximate_pi(int) def approximate_pi(n): step = 1.0 / n result = 0 for i in range(n): x = (i + 0.5) * step result += 4.0 / (1.0 + x * x) return step * result ``` Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ ΠΈ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ Π²Ρ‹Π΄Π°Π΅Ρ‚ 0,00007 сСкунды. **cx-Freeze** cx-Freeze – это Π½Π°Π±ΠΎΡ€ скриптов ΠΈ ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ прСобразования скриптов Python Π² исполняСмыС Ρ„Π°ΠΉΠ»Ρ‹. cx\_Freeze - кроссплатформСнный. Он ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Python 3.5.2 ΠΈ Π²Ρ‹ΡˆΠ΅. Бтавится с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ pip: `pip install cx_Freeze` Для Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΠΈ исполняСмого Ρ„Π°ΠΉΠ»Π° достаточно Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ: `cxfreeze <имя Ρ„Π°ΠΉΠ»Π°>.py` Π‘Π±ΠΎΡ€ΠΊΡƒ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ΠΎΠ² ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ строки: - **\-h**, **\--help** - справка; - **\-O** - ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ сгСнСрированный Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ согласно PYTHONOPTIMIZE; - **\-c**, **\--compress** - ΡΠΆΠ°Ρ‚ΡŒ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄ Π² zip-Ρ„Π°ΠΉΠ»Π°Ρ…; - **\-s**, **\--silent** - Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ прСдупрСТдСния ΠΈ ошибки; - **\--target-dir**\=DIR, **\--install-dir**\=DIR - ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³, Π² ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ слСдуСт ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ†Π΅Π»Π΅Π²ΠΎΠΉ Ρ„Π°ΠΉΠ» ΠΈ всС зависимыС Ρ„Π°ΠΉΠ»Ρ‹. Π’Π°ΠΊΠΆΠ΅ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ использованиС сцСнария сборки, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊ: ``` import sys from cx_Freeze import setup, Executable # Dependencies are automatically detected, but it might need fine tuning. build_exe_options = {"packages": ["os"], "excludes": ["tkinter"]} # GUI applications require a different base on Windows (the default is for a # console application). base = None if sys.platform == "win32": base = "Win32GUI" setup( name = "guifoo", version = "0.1", description = "My GUI application!", options = {"build_exe": build_exe_options}, executables = [Executable("guifoo.py", base=base)]) ``` Π‘Π±ΠΎΡ€ΠΊΠ° исполняСмого Ρ„Π°ΠΉΠ»Π°: `python setup.py build` ## JIT-компиляция Python JIT-компиляция Π½Π΅ позволяСт ΡΠΊΡ€Ρ‹Π²Π°Ρ‚ΡŒ исходники ΠΈΠ»ΠΈ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹ΠΉ исполняСмый Ρ„Π°ΠΉΠ», Π½ΠΎ Π΄Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. **PyPy** PyPy - ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ языка программирования Python 2.7 ΠΈ Python 3.7. Он написан Π½Π° RPython ΠΈ содСрТит: - компилятор Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰ΠΈΠΉ Π·Π° созданиС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΠ΄Π° Python ΠΈΠ· исходного ΠΊΠΎΠ΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ прилоТСния; - ΠΎΡ†Π΅Π½Ρ‰ΠΈΠΊ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π°, отвСтствСнный Π·Π° ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ†ΠΈΡŽ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΎΠ² ΠΊΠΎΠ΄Π° Python; - стандартноС ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π½ΠΎΠ΅ пространство, ΠΎΡ‚Π²Π΅Ρ‡Π°ΡŽΡ‰Π΅Π΅ Π·Π° созданиС ΠΈ ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°ΠΌΠΈ Python, Π²ΠΈΠ΄ΠΈΠΌΡ‹ΠΌΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ. PyPy ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ сотни Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Python, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ NumPy. ΠžΡΠ½ΠΎΠ²Π½Ρ‹Π΅ особСнности (сравнСниС с CPython): - **Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ.** ΠŸΡ€ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠΈ Π΄Π»ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π²Ρ‹ΠΏΠΎΠ»Π½ΡΡŽΡ‰ΠΈΡ…ΡΡ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌ, ΠΊΠΎΠ³Π΄Π° Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ тратится Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Python, PyPy ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡƒΡΠΊΠΎΡ€ΠΈΡ‚ΡŒ ваш ΠΊΠΎΠ΄. - **ИспользованиС памяти.** ΠŸΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ Python, Ρ‚Ρ€Π΅Π±ΡƒΡŽΡ‰ΠΈΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ памяти (нСсколько сотСн Мб ΠΈΠ»ΠΈ Π±ΠΎΠ»Π΅Π΅), ΠΌΠΎΠ³ΡƒΡ‚ Π·Π°Π½ΠΈΠΌΠ°Ρ‚ΡŒ мСньшС мСста, Ρ‡Π΅ΠΌ Π² CPython. Однако это Π½Π΅ всСгда Ρ‚Π°ΠΊ, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ зависит ΠΎΡ‚ мноТСства Π΄Π΅Ρ‚Π°Π»Π΅ΠΉ. Π’Π°ΠΊΠΆΠ΅ Π±Π°Π·ΠΎΠ²Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ потрСблСния ΠΎΠΏΠ΅Ρ€Π°Ρ‚ΠΈΠ²Π½ΠΎΠΉ памяти Π²Ρ‹ΡˆΠ΅, Ρ‡Π΅ΠΌ Ρƒ CPython. Π‘ΠΊΠ°Ρ‡Π°Ρ‚ΡŒ PyPy ΠΌΠΎΠΆΠ½ΠΎ с [здСсь](https://www.pypy.org/download.html). ПослС скачивания PyPy Π³ΠΎΡ‚ΠΎΠ² ΠΊ запуску послС распаковки Π°Ρ€Ρ…ΠΈΠ²Π°. Если Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ PyPy доступным для всСй систСмы, достаточно ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΡΠΈΠΌΠ²ΠΎΠ»ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ ссылку Π½Π° исполняСмый Ρ„Π°ΠΉΠ» pypy Π² **/usr/local/bin**. Π’Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΡΡ‚Π°Π²ΠΈΡ‚ΡŒ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ **pyenv**. PyPy Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Π½Π° Mac, Linux (Π½Π΅ всС дистрибутивы) ΠΈΠ»ΠΈ Windows. Для запуска ΠΊΠΎΠ΄Π° с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ PyPy вмСсто ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ **python3** (ΠΊΠ°ΠΊ c ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ CPython) достаточно Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒΡΡ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ **pypy3**: `pypy3 something.py` **Pyston** Pyston - это Ρ„ΠΎΡ€ΠΊ CPython 3.8.8 с Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΉ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠ΅ΠΉ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π’ настоящСС врСмя ΠΎΠ½ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ установку Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠ· исходников. Или с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ **pyenv**. Π’ Pyston ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ всС возмоТности CPython, Π² Ρ‚ΠΎΠΌ числС C API для Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ Π½Π° языкС Π‘ΠΈ. Π‘Ρ€Π΅Π΄ΠΈ основных ΠΎΡ‚Π»ΠΈΡ‡ΠΈΠΉ Pyston ΠΎΡ‚ CPython ΠΏΠΎΠΌΠΈΠΌΠΎ ΠΎΠ±Ρ‰ΠΈΡ… ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΉ выдСляСтся использованиС[DynASM JIT](https://luajit.org/dynasm.html) ΠΈ[inline-ΠΊΡΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΡ](https://bugs.python.org/issue14757). ## Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ рассмотрСли 5 Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ² AOT-компиляции Python. Для Π»ΡŽΠ±ΠΈΡ‚Π΅Π»Π΅ΠΉ Π°Π½Π°Π»ΠΈΡ‚ΠΈΠΊΠΈ, Π½ΠΈΠΆΠ΅ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π° Ρ‚Π°Π±Π»ΠΈΡ†Π° со ΡΡ€Π°Π²Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ Π°Π½Π°Π»ΠΈΠ·ΠΎΠΌ. | | | | | | | |---|---|---|---|---|---| | | **PyInstaller** | **Cython** | **Nuitka** | **Pythran** | **cx-Freeze** | | ГСнСрация Π°Π²Ρ‚ΠΎΠ½ΠΎΠΌΠ½Ρ‹Ρ… исполняСмых Ρ„Π°ΠΉΠ»ΠΎΠ² | \+ | \- | \+ | \- | \+ | | ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ python-модуля Π² исполняСмый Ρ„Π°ΠΉΠ», совмСстимый с CPython | \- | \+ | \+ | \+ | \+ | | ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π±Π°ΠΉΡ‚-ΠΊΠΎΠ΄Π° Python | \+ | \- | \+ | \- | \+ | | Врансляция Python Π² Π‘/C++ | \- | \+ | \+ | \+ | \- | | ΠšΡ€ΠΎΡΡΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅Π½Π½ΠΎΡΡ‚ΡŒ | \+ | \+ | \+ | \+ | \+ | | ΠšΡ€ΠΎΡΡΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ | \- | \- | \- | \- | \- | Π‘Ρ€Π΅Π΄Π½Π΅Π΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠ΅ врСмя выполнСния ΠΊΠΎΠ΄Π° Π½Π° Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… вСрсиях CPython, ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°Ρ… с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ JIT-компиляции ΠΈ послС сборки Π½Π° Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ°Ρ… AOT-компиляции: ![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/579/021/08d/57902108df33a9aa3734859ab9df7f0a.jpg) ![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/350/a5c/2a9/350a5c2a95414192fa578eaf40b10f33.png) ## Бписок Π»ΠΈΡ‚Π΅Ρ€Π°Ρ‚ΡƒΡ€Ρ‹ 1. [http://www.pyinstaller.org/](http://www.pyinstaller.org/) 2. [https://cython.org/](https://cython.org/) 3. [https://nuitka.net/](https://nuitka.net/) 4. [https://github.com/serge-sans-paille/pythran](https://github.com/serge-sans-paille/pythran) 5. [https://cx-freeze.readthedocs.io/en/latest/](https://cx-freeze.readthedocs.io/en/latest/) 6. [https://github.com/pyston/pyston](https://github.com/pyston/pyston) 7. [https://www.pypy.org/](https://www.pypy.org/)
Shard134 (laksa)
Root Hash14843476518697139734
Unparsed URLcom,habr!/ru/companies/numdes/articles/581374/ s443