πŸ•·οΈ Crawler Inspector

URL Lookup

Direct Parameter Lookup

Raw Queries and Responses

1. Shard Calculation

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

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
1 day ago
πŸ€–
ROBOTS ALLOWED

Page Info Filters

FilterStatusConditionDetails
HTTP statusPASSdownload_http_code = 200HTTP 200
Age cutoffPASSdownload_stamp > now() - 6 MONTH0 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/exness/articles/542106/
Last Crawled2026-04-06 11:56:28 (1 day ago)
First Indexednot set
HTTP Status Code200
Meta TitleКак ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Python / Π₯Π°Π±Ρ€
Meta DescriptionΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€! Π― Ρ…ΠΎΡ‡Ρƒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠ± ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ событии, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я ΡƒΠ·Π½Π°Π» ΠΏΠ°Ρ€Ρƒ мСсяцСв Π½Π°Π·Π°Π΄. ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, ΠΎΠ΄Π½Π° популярная python-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΡƒΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ Π³ΠΎΠ΄Π° распространяСтся Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ²,...
Meta Canonicalnull
Boilerpipe Text
ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€! Π― Ρ…ΠΎΡ‡Ρƒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠ± ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ событии, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я ΡƒΠ·Π½Π°Π» ΠΏΠ°Ρ€Ρƒ мСсяцСв Π½Π°Π·Π°Π΄. ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, ΠΎΠ΄Π½Π° популярная python-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΡƒΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ Π³ΠΎΠ΄Π° распространяСтся Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ прямо ΠΈΠ· python. И Ρ€Π΅Ρ‡ΡŒ Π½Π΅ ΠΏΡ€ΠΎ Π±Π°Π½Π°Π»ΡŒΠ½ΡƒΡŽ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ PyInstaller -ΠΎΠΌ, Π° ΠΏΡ€ΠΎ Ρ‡Π΅ΡΡ‚Π½ΡƒΡŽ Ahead-of-time ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Ρ†Π΅Π»ΠΎΠ³ΠΎ python-ΠΏΠ°ΠΊΠ΅Ρ‚Π°. Если Π²Ρ‹ ΡƒΠ΄ΠΈΠ²Π»Π΅Π½Ρ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ я, Π΄ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚. Объясню, ΠΏΠΎΡ‡Π΅ΠΌΡƒ я ΡΡ‡ΠΈΡ‚Π°ΡŽ это событиС ΠΏΠΎ-настоящСму ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. БущСствуСт Π΄Π²Π° Π²ΠΈΠ΄Π° компиляции:Β  Ahead-of-time (AOT) , ΠΊΠΎΠ³Π΄Π° вСсь ΠΊΠΎΠ΄ компилируСтся Π΄ΠΎ запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ Just in time compiler (JIT) , ΠΊΠΎΠ³Π΄Π° нСпосрСдствСнно компиляция ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠ΄ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ процСссора осущСствляСтся Π²ΠΎ врСмя Π΅Π΅ выполнСния. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ осущСствляСтся Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машиной ΠΈΠ»ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ. Если ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ популярныС языки программирования ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ компиляции, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ список: Ahead-of-time compiler: C, C++, Rust, Kotlin, Nim, D, Go, Dart; Just in time compiler: Lua, Π‘#, Groovy, Dart. Π’ python ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ Π½Π΅Ρ‚ JIT компилятора, Π½ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Ρ‚Π°ΠΊΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π°Π²Π½ΠΎ Бмотря Π½Π° эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ: статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки находятся Π² ΠΎΠ±Π΅ΠΈΡ… строках . НСкоторыС Π΄Π°ΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒΡΡ с двумя вСрсиями компиляторов: Kotlin ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ с JIT JavaVM, Ρ‚Π°ΠΊ ΠΈ с AOT Kotlin/Native. Π’ΠΎ ΠΆΠ΅ самоС ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ Dart (вСрсии 2). A Π²ΠΎΡ‚ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ JIT-ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ Π²ΠΏΠΎΠ»Π½Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ.Β  ΠŸΡ€ΠΈ запускС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина сначала Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π·Π°Ρ‚Π΅ΠΌ послС накоплСния статистики, запускаСтся компиляция Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π½Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… частСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина отслСТиваСт Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠΆΠ΅ скомпилированными ΠΈ Π½Π΅ скомпилированными участками ΠΊΠΎΠ΄Π° Π² зависимости ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…. ΠŸΡ€ΠΈ использовании JIT компиляции Ρ‚ΠΈΠΏΡ‹ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ‚ΠΎ ΠΈ Π½ΡƒΠΆΠ½Ρ‹, вСдь информация ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… собираСтся Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ всС популярныС динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки программирования Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ с JIT компилятором. Но ΠΊΠ°ΠΊ Π±Ρ‹Ρ‚ΡŒ с AOT компиляциСй ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅Ρ‚ Ρ‚ΠΈΠΏΠΎΠ²? МСня ΠΎΡ‡Π΅Π½ΡŒ заинтСрСсовал этот вопрос, ΠΈ я ΠΏΠΎΠ»Π΅Π· Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ. Π˜Ρ‚Π°ΠΊ, вСрнСмся ΠΊ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π² Π½Π°Ρ‡Π°Π»Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ. Π Π΅Ρ‡ΡŒ ΠΏΡ€ΠΎ mypy - Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярный синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ python-ΠΊΠΎΠ΄Π°. Π‘ апрСля 2019 Π³ΠΎΠ΄Π° эта ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° распространяСтся Π² скомпилированном Π²ΠΈΠ΄Π΅, ΠΎ Ρ‡Π΅ΠΌ рассказываСтся Π² Π±Π»ΠΎΠ³Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. А для компиляции ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΠΎΡ‚ Ρ‚Π΅Ρ… ΠΆΠ΅ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² β€” mypyc . ΠŸΠΎΠ³ΡƒΠ³Π»ΠΈΠ² Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ, я нашСл достаточно Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ β€œ ΠŸΡƒΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Ρ‚ΠΈΠΏΠΎΠ² 4 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² строк Python-ΠΊΠΎΠ΄Π° ” ΠΏΡ€ΠΎ становлСниС ΠΈ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ mypy (Π½Π° Π₯Π°Π±Ρ€Π΅ доступСн ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄: Ρ‡Π°ΡΡ‚ΡŒ 1 , Ρ‡Π°ΡΡ‚ΡŒ 2 , Ρ‡Π°ΡΡ‚ΡŒ 3 ). Π’Π°ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ рассказываСтся ΠΎ цСлях создания mypyc: ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ²ΡˆΠΈΡΡŒ с нСдостаточной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ mypy ΠΏΡ€ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… python-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π² Dropbox, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ΄Π°, Π° Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ запуска ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΊΠ°ΠΊ сСрвиса. Но исчСрпав ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ возмоТности ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ: ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ всС Π½Π° go ΠΈΠ»ΠΈ Π½Π° cython . Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ пошСл ΠΏΠΎ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌΡƒ ΠΏΡƒΡ‚ΠΈ β€” написаниС своСго AOT python-компилятора . Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ mypy ΠΈ Ρ‚Π°ΠΊ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ Π²ΠΎ врСмя исполнСния ΠΊΠΎΠ΄Π°. Π’ΠΎ Π΅ΡΡ‚ΡŒ mypy ΡƒΠΆΠ΅ β€œΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚β€ python , Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для статистичСского Π°Π½Π°Π»ΠΈΠ·Π°, Π° Π²ΠΎΡ‚ mypyc ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π”ΡƒΠΌΠ°ΡŽ Ρ‚ΡƒΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ Π² вопросС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ python-ΠΊΠΎΠ΄. Python c вСрсии 3.4 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ², Π° mypy ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ коррСктности Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, python ΠΊΠ°ΠΊ Π±Ρ‹ ΡƒΠΆΠ΅ ΠΈ Π½Π΅ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ AOT ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ. Но Π·Π°Π³Π²ΠΎΠ·Π΄ΠΊΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ mypyc ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π½Π΅Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ ! Ѐункция bubble_sort Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сортировки β€œΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠΌβ€.Β Π€Π°ΠΉΠ» lib.py: def bubble_sort(data): Β Β Β n = len(data) Β Β Β for i in range(n - 1): Β Β Β Β Β Β Β for j in range(n - i - 1): Β Β Β Β Β Β Β Β Β Β Β if data[j] > data[j + 1]: Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β buff = data[j] Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β data[j] = data[j + 1] Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β data[j + 1] = buff Β Β Β return data Π£ Ρ‚ΠΈΠΏΠΎΠ² Π½Π΅Ρ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ, Π½ΠΎ это Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ mypyc Π΅Π΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ mypyc . Он Π½Π΅ распространяСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ, Π½ΠΎ Ссли Ρƒ вас установлСн mypy , Ρ‚ΠΎ ΠΈ mypyc ΡƒΠΆΠ΅ присутствуСт Π² систСмС! ЗапускаСм mypyc , ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ: > mypyc lib.py ПослС запуска Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π±ΡƒΠ΄ΡƒΡ‚ созданы ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ: .mypy_cache Β  β€” mypy кэш, mypyc нСявно запускаСт mypy для Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ получСния AST; build β€” Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ сборки; lib.cpython-38-x86_64-linux-gnu.so β€” собствСнно сборка ΠΏΠΎΠ΄ Ρ†Π΅Π»Π΅Π²ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ. Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» прСдставляСт ΠΈΠ· сСбя Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ CPython Extension. CPython Extension β€” встроСнный Π² CPython ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ взаимодСйствия с ΠΊΠΎΠ΄ΠΎΠΌ, написанным Π½Π° Π‘/C++. По сути это динамичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ CPython ΡƒΠΌΠ΅Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅ нашСго модуля lib . Π§Π΅Ρ€Π΅Π· Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ осущСствляСтся взаимодСйствиС с модулями, написанными Π½Π° python. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ состоит ΠΈΠ· Π΄Π²ΡƒΡ… Ρ„Π°Π·: ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ python ΠΊΠΎΠ΄Π° Π² ΠΊΠΎΠ΄ Π‘; ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π‘ Π² Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ .so Ρ„Π°ΠΉΠ», для этого mypyc сам запускаСт gcc ( gcc ΠΈ python-dev Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ установлСны). Π€Π°ΠΉΠ» lib.cpython-38-x86_64-linux-gnu.so ΠΈΠΌΠ΅Π΅Ρ‚ прСимущСство ΠΏΠ΅Ρ€Π΅Π΄ lib.py ΠΏΡ€ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅, ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½. Ну ΠΈ Π΄Π°Π²Π°ΠΉΡ‚Π΅ сравним ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ модуля Π΄ΠΎ ΠΈ послС компиляции. Для этого создадим Ρ„Π°ΠΉΠ» main.py с ΠΊΠΎΠ΄ΠΎΠΌ запуска сортировки: import lib data = lib.bubble_sort(list(range(5000, 0, -1))) assert data == list(range(1, 5001)) ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹: Π”ΠΎ ПослС real 5.68 user 5.60 sys 0.01 real 2.78 user 2.73 sys 0.01 ОТидаСмо скомпилированный ΠΊΠΎΠ΄ оказался быстрСС (~ Π² 2 Ρ€Π°Π·Π°) , Ρ‡Ρ‚ΠΎ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π½Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ лишь ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ. Π₯отя ΠΎΡ‚ скомпилированного ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎ оТидаСшь большСго. Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° вопрос β€œΠΊΠ°ΠΊ компилируСтся динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ код” , придСтся Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² прСдставлСниС этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Π‘. Но Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π΅Π΅ Π±ΡƒΠ΄Π΅Ρ‚ достаточно слоТно, поэтому Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΠΎΠΏΡ€ΠΎΡ‰Π΅.Β Β  Ѐункция sum(a, b) Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ суммы ΠΎΡ‚ Π΄Π²ΡƒΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…: def sum(a, b): Β Β return a + b ΠŸΠ΅Ρ€Π΅Π΄ запуском компиляции я ΠΎΠΆΠΈΠ΄Π°Π» ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½Π° Π‘: int sum(int a, int b) { Β Β Β return a + b; } Однако Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ оказался cущСствСнно ΠΈΠ½Ρ‹ΠΌ ( ΠΊΠΎΠ΄ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½ ): PyObject *CPyDef_sum(PyObject *cpy_r_a, PyObject *cpy_r_b){ Β Β Β Β return PyNumber_Add(cpy_r_a, cpy_r_b); } Рассмотрим, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ происходит. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ Ρ‚ΠΈΠΏΡ‹ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, функция Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса PyObject , ΠΏΠΎ сути это Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ CPython структуры. Π”Π°Π»Π΅Π΅ компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ , Π½ΠΎ ΠΊΠ°ΠΊ, Ссли настоящиС Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² нСизвСстны Π²ΠΎ врСмя компиляции: это ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹Π΅ числа, числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, списки ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‚ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ. И Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π² этом случаС mypyc?Β  Как оказалось, всС ΠΎΡ‡Π΅Π½ΡŒ просто: ΠΎΠ½ просит CPython ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ эти Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Ѐункция PyNumber_Add β€” это внутрСнняя функция Π‘Python , которая доступна ΠΈΠ· Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, вСдь Π‘Python ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΡƒΠΌΠ΅Π΅Ρ‚ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ свои ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ . ВзаимодСйствиС CPython c Extension ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠΌ: Β β€” А посчитай-ΠΊΠ° ΠΌΠ½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sum для A, B; Β β€” Π₯ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ скаТи сначала, сколько Π±ΡƒΠ΄Π΅Ρ‚ A + B; Β β€” Π‘ΡƒΠ΄Π΅Ρ‚ Π‘; Β β€” Π₯ΠΎΡ€ΠΎΡˆΠΎ, Ρ‚ΠΎΠ³Π΄Π° Π΄Π΅Ρ€ΠΆΠΈ ΠΎΡ‚Π²Π΅Ρ‚ - Π‘. Π’ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ Π½Π΅Ρ…ΠΈΡ‚Ρ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ компиляции динамичСского ΠΊΠΎΠ΄Π°: ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ всС, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ, Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΡ‚Π΄Π°Π΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ .Β  ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ выглядит гротСскно, Π½ΠΎ Π΄Π°ΠΆΠ΅ нСсмотря Π½Π° Ρ‚Π°ΠΊΡƒΡŽ Π½Π΅ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ , mypyc позволяСт Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ сущСствСнного прироста ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ , ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с сортировкой. Ѐункция sum(a: int, b: int) Π˜Ρ‚Π°ΠΊ, Ρƒ нас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ python, ΠΈ ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π½Π΅ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ это ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ основная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π²ΠΎ мноТСствСнном взаимодСйствии CPython - Extension . Но ΠΊΠ°ΠΊ это ΠΏΠΎΠ±ΠΎΡ€ΠΎΡ‚ΡŒ?Β  Для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ эффСктивности, Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, ΠΌΠΎΠ³Π»ΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ дольшС ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ Ρƒ сСбя Π±Π΅Π· обращСния ΠΊ CPython . Если Π±Ρ‹ Ρƒ mypyc Π±Ρ‹Π»Π° информация ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ ΠΎΠ½ Π±Ρ‹ ΠΌΠΎΠ³ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ произвСсти слоТСниС Π±Π΅Π· Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° управлСния. Но вывСсти Ρ‚ΠΈΠΏΡ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ mypyc Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚, ΠΎΠ½ Π΄Π°ΠΆΠ΅ Π½Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄ , ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ осущСствляСтся Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sum. БоотвСтствСнно, Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠΎΡ‡ΡŒ, проставив Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ помСняСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ Π‘-функция, Ссли Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ²: def sum(a: int, b: int): Β Β return a + b Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π° C ( Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‡ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ ): PyObject *CPyDef_sum(CPyTagged cpy_r_a, CPyTagged cpy_r_b) { Β Β Β CPyTagged cpy_r_r0; Β Β Β PyObject *cpy_r_r1; Β Β Β cpy_r_r0 = CPyTagged_Add(cpy_r_a, cpy_r_b); Β Β Β cpy_r_r1 = CPyTagged_StealAsObject(cpy_r_r0); Β Β Β return cpy_r_r1; } Π“Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ: функция сущСствСнно помСнялась , Π° Π·Π½Π°Ρ‡ΠΈΡ‚, компилятор Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° появлСниС Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ измСнилось.Β  Π’Π΅ΠΏΠ΅Ρ€ΡŒ CPyDef_sum ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° PyObject , Π° структуры CPyTagged . Π­Ρ‚ΠΎ всС Π΅Ρ‰Π΅ Π½Π΅ int , Π½ΠΎ ΡƒΠΆΠ΅ ΠΈ Π½Π΅ Ρ‡Π°ΡΡ‚ΡŒ CPython , Π° Ρ‡Π°ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ mypyc, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ добавляСт Π² скомпилированный ΠΊΠΎΠ΄ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. Для Π΅Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅ сначала провСряСтся Ρ‚ΠΈΠΏ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ функция sum Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с int ΠΈ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Π½Π΅ получится. Π”Π°Π»Π΅Π΅ происходит Π²Ρ‹Π·ΠΎΠ² CPyTaggetAdd вмСсто PyNumber_Add . Π­Ρ‚ΠΎ ΡƒΠΆΠ΅ внутрСнняя функция mypyc . Если Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² ΠΊΠΎΠ΄ CPyTaggetAdd , Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ происходит ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ a ΠΈ b , ΠΈ Ссли ΠΎΠ½ΠΈ ΡƒΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² int, Ρ‚ΠΎ происходит простоС суммированиС, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: if (likely(CPyTagged_CheckShort(left) && CPyTagged_CheckShort(right))) { Β Β Β Β CPyTagged sum = left + right; Β Β Β Β if (likely(!CPyTagged_IsAddOverflow(sum, left, right))) { Β Β Β Β Β Β Β Β return sum; Β Β Β Β } } Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, наш Π΄ΠΈΠ°Π»ΠΎΠ³ CPython - Extension прСвращаСтся ΠΈΠ· абсурдного Π² Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ : Β β€” А посчитай-ΠΊΠ° ΠΌΠ½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sum для A, B; Β β€” Π₯ΠΎΡ€ΠΎΡˆΠΎ, Ρ‚ΠΎΠ³Π΄Π° Π΄Π΅Ρ€ΠΆΠΈ ΠΎΡ‚Π²Π΅Ρ‚ Π‘. Ѐункция bubble_sort(data: List[int]) Настало врСмя Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сортировки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ провСсти Π·Π°ΠΌΠ΅Ρ€Ρ‹ скорости. ИзмСним Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ для data : def bubble_sort(data: List[int]):     … Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈ Π·Π°ΠΌΠ΅Ρ€ΠΈΠΌ врСмя сортировки: Π‘Π΅Π· компиляции Π‘ компиляциСй, Π±Π΅Π· Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² Π‘ компиляциСй ΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ Ρ‚ΠΈΠΏΠΎΠ² real 5.68 user 5.60 sys 0.01 real 2.78 user 2.73 sys 0.01 real 1.32 user 1.30 sys 0.01 Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π΅Ρ‰Π΅ Π΄Π²ΡƒΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ ускорСниС ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ скомпилированного, Π½Π΅ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ…ΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ! ΠŸΠ°Ρ€Π° слов ΠΎ mypyc Если Π²Ρ‹ ΡƒΠΆΠ΅ Π±Ρ€ΠΎΡΠΈΠ»ΠΈΡΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ваши ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, Ρ‚ΠΎ стоит Π·Π°Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠ°Ρ€Ρƒ ΠΌΠΈΠ½ΡƒΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ этот Π°Π±Π·Π°Ρ† Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°. Π“Π»Π°Π²Π½Ρ‹ΠΌ нСдостатком mypyc ΠΏΠΎΠΊΠ° остаСтся ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ: ΠΎΠ½ всС Π΅Ρ‰Π΅ Π² Π°Π»ΡŒΡ„Π΅, Ρ‚ΠΎΡ‡Π½Π΅Π΅, сСйчас это Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π° Ρ‡Π°ΡΡ‚ΡŒ mypy . БобствСнно ΠΎΠ½ ΠΈ создавался ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄ Π·Π°Π΄Π°Ρ‡Ρƒ увСличСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ mypy ΠΈ для этой Ρ†Π΅Π»ΠΈ ΠΎΠ½ ΡƒΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ Π³ΠΎΠ΄Π° ΠΊΠ°ΠΊ стабилСн . Но ΠΊΠ°ΠΊ ΠΎΠ±Ρ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ компиляции любого python-ΠΊΠΎΠ΄Π°, ΠΎΠ½ Π΅Ρ‰Π΅ сыроват, ΠΎ Ρ‡Π΅ΠΌ Π°Π²Ρ‚ΠΎΡ€Ρ‹ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‚ Π½Π° страницС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’Π°ΠΊΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ограничСния, Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ Π½Π° ΠΊΠΎΠ΄, Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ со скомпилированным: ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ² Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅; Π’ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ ΠΊΠΎΠ΄Π΅ запрСщаСтся monkey patching; Mypy Ρ…Ρ€Π°Π½ΠΈΡ‚ классы Π² Π‘ структурах для увСличСния скорости доступа ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ, Π½ΠΎ это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ совмСстимости. Π­Ρ‚ΠΈ ограничСния носят ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ слСдствиСм Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ компилятора. Но ΠΈΠ· Π½ΠΈΡ… ΠΏΡ€ΠΎΠΈΡΡ‚Π΅ΠΊΠ°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ограничСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования модуля стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ abc. Помимо этого, Π΅ΡΡ‚ΡŒ большая порция Π½Π΅Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΎΠΊ ΠΈ Π±Π°Π³ΠΎΠ². Π§Π°Ρ‰Π΅ всСго ΠΎΠ½ΠΈ приводят ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ gcc отказываСтся ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π‘ ΠΊΠΎΠ΄, ΠΏΡ€ΠΈ этом, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π½Π°ΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ошибки, приходится ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π² Π³ΠΎΠ»ΠΎΠ²Π΅ Π½Π΅ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ рСвСрс ΠΈΠ½ΠΆΠΈΠ½ΠΈΡ€ΠΈΠ½Π³Π°. Пока Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚Π°ΠΊΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ компиляции ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠΎΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ 20 % ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ , Π·Π°Ρ‚ΠΎ ΠΊΠ°ΠΊΠΈΡ… Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΡƒΠΆΠ΅ скомпилированными модулями я Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ». Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, большая Ρ‡Π°ΡΡ‚ΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ Π² ΠΈΡ… Roadmap Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°, ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ готовится ΠΊ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΌΡƒ Ρ€Π΅Π»ΠΈΠ·Ρƒ . Nuitka Π£ΠΆΠ΅ Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ ΡΡ‚Π°Ρ‚ΡŒΠ΅ΠΉ, я ΡƒΠ·Π½Π°Π» ΠΏΡ€ΠΎ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌΠΈ цСлями. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Nuitka сильно Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ описанный Π²Ρ‹ΡˆΠ΅. Π Π°Π·Π½ΠΈΡ†Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Nuitka ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Python ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² Π‘++ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ собираСтся Π² Π‘Python Extension . Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ вСсь ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² ΠΎΠ΄ΠΈΠ½ исполняСмый Ρ„Π°ΠΉΠ» , Ρ‚ΠΎΠ³Π΄Π° ΡƒΠΆΠ΅ сам CPython ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΊΠ°ΠΊ динамичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° libpython . Nuitka ΠΏΠΎΠΊΠ° Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ², поэтому Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ зависят ΠΎΡ‚ наличия Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Π°Ρ ΠΆΠ΅ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π² ΠΌΠΎΠ΅ΠΌ тСстС соотвСтствуСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ mypy Π½Π° Π½Π΅ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ НСдавно ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΉ ΠΊΠΎΠ»Π»Π΅Π³Π° высказал ΠΌΠ½Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ mypy сильно услоТняСт Π΅ΠΌΡƒ Тизнь: ΠΈΠ· тСкста ошибок Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, β€œΡ‡Π΅Π³ΠΎ ΠΎΠ½ ΠΎΡ‚ мСня хочСт”, Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠ· PyCharm Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ я понимаю, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅Π΄ΠΎΠΎΡ†Π΅Π½ΠΈΠ²Π°Π΅Ρ‚ mypy . Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большСС, Ρ‡Π΅ΠΌ просто синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ . По сути ΠΎΠ½ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ подмноТСство языка, ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π² ΠΏΠ»Π°Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ сильно прСвосходит ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ python. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ встраниваниС mypy Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° β€” инвСстиция Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² поиск ошибок, Π½ΠΎ ΠΈ Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠΉ пСрфоманс прилоТСния. МнС ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ взаимодСйствиС с CPython осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, вСдь это позволяСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π½Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, оставив Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Π’Π°ΠΊΠΎΠΉ ΠΏΡƒΡ‚ΡŒ прСдставляСтся ΠΌΠ½Π΅ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ бСзопасным (учитывая, Ρ‡Ρ‚ΠΎ mypyc Π΄ΠΎ сих ΠΏΠΎΡ€ Π² Π°Π»ΡŒΡ„Π΅). ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈ mypyc Π½Π° ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅, Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π²Π°ΠΌ, Π½ΠΎ Ссли Π²Ρ‹ ΡƒΠΆΠ΅ ΡƒΠΏΠ΅Ρ€Π»ΠΈΡΡŒ Π² ΠΏΠΎΡ‚ΠΎΠ»ΠΎΠΊ ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΠΏΠΎΠ΄ΡƒΠΌΡ‹Π²Π°Π΅Ρ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ части Π½Π° Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ языки, Ρ‚ΠΎ стоит ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ mypyc , Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Ρ‡Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это просто, Ссли Π²Ρ‹ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ mypy. P.S. НадСюсь, Π²Π°ΠΌ Π±Ρ‹Π»ΠΎ интСрСсно ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Π½ΠΎΠ²ΠΎΠΌ способС ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ python, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π³Π»ΡƒΠ±ΠΆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ΅ компиляции динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Если Ρ‚Π΅ΠΌΠ° окаТСтся интСрСсной, Ρ‚ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽ большС Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ mypyc , Π΅Π³ΠΎ ограничСния ΠΈ частыС ошибки, Π° Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ. UPD Π’ коммСнтариях подсказали, ΠΎΠ± Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΌ python компиляторС - Cython , оказываСтся Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ python ΠΊΠΎΠ΄ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ (минуя Ρ€ΡƒΡ‡Π½ΡƒΡŽ Ρ„Π°Π·Ρƒ прСобразования ΠΊΠΎΠ΄Π° Π² cython -ΠΊΠΎΠ΄). Будя ΠΏΠΎ Π·Π°ΠΌΠ΅Ρ€Π°ΠΌ cython ΠΏΠΎΠΊΠ° Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ², Π½ΠΎ врСмя выполнСния ( real 1.82 ) оказалось посСрСдинС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ mypyc Π½Π° Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΈ Π½Π΅ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π°. Но Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅Π΅ добавят Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.
Markdown
[ВсС ΠΏΠΎΡ‚ΠΎΠΊΠΈ](https://habr.com/ru/articles/) [Π’ΠΎΠΉΡ‚ΠΈ](https://habr.com/kek/v1/auth/habrahabr/?back=/ru/companies/exness/articles/542106/&hl=ru) [![](https://habrastorage.org/getpro/habr/company/0d2/a3c/808/0d2a3c80845887b559d3602a5e085d5f.png)](https://habr.com/ru/companies/exness/profile/) [Exness](https://habr.com/ru/companies/exness/profile/) Tech professionals. Good people 182 ΠŸΠΎΠ΄ΠΏΠΈΡΡ‡ΠΈΠΊΠΈ ΠŸΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ [![](https://habrastorage.org/r/w48/getpro/habr/avatars/caa/9c9/cad/caa9c9cad82105a9a46f4848dbe4aa86.jpg)](https://habr.com/ru/users/zueve/) [zueve](https://habr.com/ru/users/zueve/) 12 Ρ„Π΅Π² 2021 Π² 12:41 # Как ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Python 10 ΠΌΠΈΠ½ 68K [Π‘Π»ΠΎΠ³ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Exness](https://habr.com/ru/companies/exness/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/1e9/1ba/b49/1e91bab4996a417303df57b5b644da5b.jpg) ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€\! Π― Ρ…ΠΎΡ‡Ρƒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠ± ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ событии, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я ΡƒΠ·Π½Π°Π» ΠΏΠ°Ρ€Ρƒ мСсяцСв Π½Π°Π·Π°Π΄. ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, ΠΎΠ΄Π½Π° популярная python-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΡƒΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ Π³ΠΎΠ΄Π° распространяСтся Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ прямо ΠΈΠ· python. И Ρ€Π΅Ρ‡ΡŒ Π½Π΅ ΠΏΡ€ΠΎ Π±Π°Π½Π°Π»ΡŒΠ½ΡƒΡŽ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ *PyInstaller*\-ΠΎΠΌ, Π° ΠΏΡ€ΠΎ Ρ‡Π΅ΡΡ‚Π½ΡƒΡŽ *Ahead-of-time* ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Ρ†Π΅Π»ΠΎΠ³ΠΎ python-ΠΏΠ°ΠΊΠ΅Ρ‚Π°. Если Π²Ρ‹ ΡƒΠ΄ΠΈΠ²Π»Π΅Π½Ρ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ я, Π΄ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚. Объясню, ΠΏΠΎΡ‡Π΅ΠΌΡƒ я ΡΡ‡ΠΈΡ‚Π°ΡŽ это событиС ΠΏΠΎ-настоящСму ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. БущСствуСт Π΄Π²Π° Π²ΠΈΠ΄Π° компиляции: *Ahead-of-time (AOT)*, ΠΊΠΎΠ³Π΄Π° вСсь ΠΊΠΎΠ΄ компилируСтся Π΄ΠΎ запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ *Just in time compiler (JIT)*, ΠΊΠΎΠ³Π΄Π° нСпосрСдствСнно компиляция ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠ΄ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ процСссора осущСствляСтся Π²ΠΎ врСмя Π΅Π΅ выполнСния. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ осущСствляСтся Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машиной ΠΈΠ»ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ. Если ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ популярныС языки программирования ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ компиляции, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ список: - Ahead-of-time compiler: C, C++, Rust, Kotlin, Nim, D, Go, Dart; - Just in time compiler: Lua, Π‘\#, Groovy, Dart. *Π’ python ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ Π½Π΅Ρ‚ JIT компилятора, Π½ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Ρ‚Π°ΠΊΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π°Π²Π½ΠΎ* Бмотря Π½Π° эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ: **статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки находятся Π² ΠΎΠ±Π΅ΠΈΡ… строках**. НСкоторыС Π΄Π°ΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒΡΡ с двумя вСрсиями компиляторов: Kotlin ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ с JIT JavaVM, Ρ‚Π°ΠΊ ΠΈ с AOT Kotlin/Native. Π’ΠΎ ΠΆΠ΅ самоС ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ Dart (вСрсии 2). A Π²ΠΎΡ‚ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ JIT-ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ Π²ΠΏΠΎΠ»Π½Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ. > *ΠŸΡ€ΠΈ запускС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина сначала Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π·Π°Ρ‚Π΅ΠΌ послС накоплСния статистики, запускаСтся компиляция Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π½Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… частСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина отслСТиваСт Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠΆΠ΅ скомпилированными ΠΈ Π½Π΅ скомпилированными участками ΠΊΠΎΠ΄Π° Π² зависимости ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….* ΠŸΡ€ΠΈ использовании JIT компиляции Ρ‚ΠΈΠΏΡ‹ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ‚ΠΎ ΠΈ Π½ΡƒΠΆΠ½Ρ‹, вСдь информация ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… собираСтся Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ всС популярныС динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки программирования Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ с JIT компилятором. **Но ΠΊΠ°ΠΊ Π±Ρ‹Ρ‚ΡŒ с AOT компиляциСй ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅Ρ‚ Ρ‚ΠΈΠΏΠΎΠ²?** МСня ΠΎΡ‡Π΅Π½ΡŒ заинтСрСсовал этот вопрос, ΠΈ я ΠΏΠΎΠ»Π΅Π· Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ. Π˜Ρ‚Π°ΠΊ, вСрнСмся ΠΊ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π² Π½Π°Ρ‡Π°Π»Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ. Π Π΅Ρ‡ΡŒ ΠΏΡ€ΠΎ [mypy](http://mypy-lang.org/) - Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярный синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ python-ΠΊΠΎΠ΄Π°. ![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/6f3/fb7/42d/6f3fb742d999b54bb8d8bfc3daf1c923) Π‘ апрСля 2019 Π³ΠΎΠ΄Π° эта ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° распространяСтся Π² скомпилированном Π²ΠΈΠ΄Π΅, ΠΎ Ρ‡Π΅ΠΌ рассказываСтся Π² [Π±Π»ΠΎΠ³Π΅](https://mypy-lang.blogspot.com/2019/04/mypy-0700-released-up-to-4x-faster.html) ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. А для компиляции ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΠΎΡ‚ Ρ‚Π΅Ρ… ΠΆΠ΅ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² β€” *mypyc*. ΠŸΠΎΠ³ΡƒΠ³Π»ΠΈΠ² Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ, я нашСл достаточно Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ β€œ[ΠŸΡƒΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Ρ‚ΠΈΠΏΠΎΠ² 4 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² строк Python-ΠΊΠΎΠ΄Π°](https://dropbox.tech/application/our-journey-to-type-checking-4-million-lines-of-python)” ΠΏΡ€ΠΎ становлСниС ΠΈ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ mypy (Π½Π° Π₯Π°Π±Ρ€Π΅ доступСн ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄: [Ρ‡Π°ΡΡ‚ΡŒ 1](https://habr.com/ru/company/ruvds/blog/468233/), [Ρ‡Π°ΡΡ‚ΡŒ 2](https://habr.com/ru/company/ruvds/blog/468235/), [Ρ‡Π°ΡΡ‚ΡŒ 3](https://habr.com/ru/company/ruvds/blog/468237/)). Π’Π°ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ рассказываСтся ΠΎ цСлях создания mypyc: ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ²ΡˆΠΈΡΡŒ с нСдостаточной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ mypy ΠΏΡ€ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… python-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π² Dropbox, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ΄Π°, Π° Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ запуска ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΊΠ°ΠΊ сСрвиса. Но исчСрпав ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ возмоТности ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ: ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ всС Π½Π° *go* ΠΈΠ»ΠΈ Π½Π° *cython*. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ пошСл ΠΏΠΎ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌΡƒ ΠΏΡƒΡ‚ΠΈ β€” **написаниС своСго AOT python-компилятора**. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ *mypy* ΠΈ Ρ‚Π°ΠΊ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ Π²ΠΎ врСмя исполнСния ΠΊΠΎΠ΄Π°. Π’ΠΎ Π΅ΡΡ‚ΡŒ **mypy ΡƒΠΆΠ΅ β€œΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚β€ python**, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для статистичСского Π°Π½Π°Π»ΠΈΠ·Π°, Π° Π²ΠΎΡ‚ *mypyc* ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π”ΡƒΠΌΠ°ΡŽ Ρ‚ΡƒΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ Π² вопросС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ python-ΠΊΠΎΠ΄. Python c вСрсии 3.4 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ², Π° *mypy* ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ коррСктности Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, python ΠΊΠ°ΠΊ Π±Ρ‹ ΡƒΠΆΠ΅ ΠΈ Π½Π΅ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ AOT ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ. Но Π·Π°Π³Π²ΠΎΠ·Π΄ΠΊΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ *mypyc* **ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π½Π΅Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄**\! ## Ѐункция bubble\_sort Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сортировки β€œΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠΌβ€. Π€Π°ΠΉΠ» *lib.py:* ``` ``` Π£ Ρ‚ΠΈΠΏΠΎΠ² Π½Π΅Ρ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ, Π½ΠΎ это Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ *mypyc* Π΅Π΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ *mypyc*. Он Π½Π΅ распространяСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ, Π½ΠΎ Ссли Ρƒ вас установлСн *mypy*, Ρ‚ΠΎ ΠΈ *mypyc* ΡƒΠΆΠ΅ присутствуСт Π² систСмС! ЗапускаСм *mypyc*, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ: ``` > mypyc lib.py ``` ПослС запуска Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π±ΡƒΠ΄ΡƒΡ‚ созданы ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ: - `.mypy_cache` β€” *mypy* кэш, mypyc нСявно запускаСт mypy для Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ получСния AST; - `build` β€” Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ сборки; - `lib.cpython-38-x86_64-linux-gnu.so` β€” собствСнно сборка ΠΏΠΎΠ΄ Ρ†Π΅Π»Π΅Π²ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ. Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» прСдставляСт ΠΈΠ· сСбя Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ CPython Extension. > *CPython Extension* β€” встроСнный Π² *CPython* ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ взаимодСйствия с ΠΊΠΎΠ΄ΠΎΠΌ, написанным Π½Π° Π‘/C++. По сути это динамичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ *CPython* ΡƒΠΌΠ΅Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅ нашСго модуля *lib*. Π§Π΅Ρ€Π΅Π· Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ осущСствляСтся взаимодСйствиС с модулями, написанными Π½Π° python. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ состоит ΠΈΠ· Π΄Π²ΡƒΡ… Ρ„Π°Π·: 1. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ python ΠΊΠΎΠ΄Π° Π² ΠΊΠΎΠ΄ Π‘; 2. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π‘ Π² Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ *.so* Ρ„Π°ΠΉΠ», для этого *mypyc* сам запускаСт gcc (*gcc* ΠΈ *python-dev* Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ установлСны). Π€Π°ΠΉΠ» `lib.cpython-38-x86_64-linux-gnu.so` ΠΈΠΌΠ΅Π΅Ρ‚ прСимущСство ΠΏΠ΅Ρ€Π΅Π΄ *lib.py* ΠΏΡ€ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅, ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½. Ну ΠΈ Π΄Π°Π²Π°ΠΉΡ‚Π΅ сравним ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ модуля Π΄ΠΎ ΠΈ послС компиляции. Для этого создадим Ρ„Π°ΠΉΠ» *main.py* с ΠΊΠΎΠ΄ΠΎΠΌ запуска сортировки: ``` ``` ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹: | | | |---|---| | Π”ΠΎ | ПослС | | real 5.68user 5.60sys 0.01 | real 2.78user 2.73sys 0.01 | ОТидаСмо скомпилированный ΠΊΠΎΠ΄ **оказался быстрСС (~ Π² 2 Ρ€Π°Π·Π°)**, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π½Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ лишь ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ. Π₯отя ΠΎΡ‚ скомпилированного ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎ оТидаСшь большСго. ![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/5a3/bbe/285/5a3bbe28516bfd798ed394c0e46afaf7) Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° вопрос *β€œΠΊΠ°ΠΊ компилируСтся динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ код”*, придСтся Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² прСдставлСниС этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Π‘. Но Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π΅Π΅ Π±ΡƒΠ΄Π΅Ρ‚ достаточно слоТно, поэтому Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΠΎΠΏΡ€ΠΎΡ‰Π΅. ## Ѐункция sum(a, b) Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ суммы ΠΎΡ‚ Π΄Π²ΡƒΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…: ``` ``` ΠŸΠ΅Ρ€Π΅Π΄ запуском компиляции я ΠΎΠΆΠΈΠ΄Π°Π» ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½Π° Π‘: ``` ``` Однако Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ оказался cущСствСнно ΠΈΠ½Ρ‹ΠΌ (**ΠΊΠΎΠ΄ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½**): ``` ``` Рассмотрим, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ происходит. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ Ρ‚ΠΈΠΏΡ‹ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, функция Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса *PyObject*, ΠΏΠΎ сути это Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ *CPython* структуры. Π”Π°Π»Π΅Π΅ **компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹**, Π½ΠΎ ΠΊΠ°ΠΊ, Ссли настоящиС Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² нСизвСстны Π²ΠΎ врСмя компиляции: это ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹Π΅ числа, числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, списки ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‚ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ. И Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π² этом случаС mypyc? Как оказалось, всС ΠΎΡ‡Π΅Π½ΡŒ просто: ΠΎΠ½ просит *CPython* ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ эти Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Ѐункция *PyNumber\_Add* β€” это внутрСнняя функция *Π‘Python*, которая доступна ΠΈΠ· Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, вСдь ***Π‘Python* ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΡƒΠΌΠ΅Π΅Ρ‚ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ свои ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹**. ВзаимодСйствиС CPython c Extension ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠΌ: > β€” А посчитай-ΠΊΠ° ΠΌΠ½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sum для A, B; > > β€” Π₯ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ скаТи сначала, сколько Π±ΡƒΠ΄Π΅Ρ‚ A + B; > > β€” Π‘ΡƒΠ΄Π΅Ρ‚ Π‘; > > β€” Π₯ΠΎΡ€ΠΎΡˆΠΎ, Ρ‚ΠΎΠ³Π΄Π° Π΄Π΅Ρ€ΠΆΠΈ ΠΎΡ‚Π²Π΅Ρ‚ - Π‘. Π’ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ Π½Π΅Ρ…ΠΈΡ‚Ρ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ компиляции динамичСского ΠΊΠΎΠ΄Π°: **ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ всС, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ, Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΡ‚Π΄Π°Π΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ**. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ выглядит гротСскно, Π½ΠΎ Π΄Π°ΠΆΠ΅ **нСсмотря Π½Π° Ρ‚Π°ΠΊΡƒΡŽ Π½Π΅ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ**, mypyc позволяСт Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ сущСствСнного **прироста ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ**, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с сортировкой. ## Ѐункция sum(a: int, b: int) Π˜Ρ‚Π°ΠΊ, Ρƒ нас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ python, ΠΈ ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π½Π΅ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ это ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ основная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π²ΠΎ **мноТСствСнном взаимодСйствии** *CPython - Extension*. Но ΠΊΠ°ΠΊ это ΠΏΠΎΠ±ΠΎΡ€ΠΎΡ‚ΡŒ? Для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ эффСктивности, Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, ΠΌΠΎΠ³Π»ΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ **дольшС ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ Ρƒ сСбя** Π±Π΅Π· обращСния ΠΊ *CPython*. Если Π±Ρ‹ Ρƒ mypyc Π±Ρ‹Π»Π° информация ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ ΠΎΠ½ Π±Ρ‹ ΠΌΠΎΠ³ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ произвСсти слоТСниС Π±Π΅Π· Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° управлСния. Но вывСсти Ρ‚ΠΈΠΏΡ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ mypyc Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚, ΠΎΠ½ Π΄Π°ΠΆΠ΅ **Π½Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄**, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ осущСствляСтся Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sum. БоотвСтствСнно, Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠΎΡ‡ΡŒ, проставив Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ помСняСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ Π‘-функция, Ссли Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ²: ``` ``` Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π° C (*Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‡ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ*): ``` ``` Π“Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ: **функция сущСствСнно помСнялась**, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, компилятор Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° появлСниС Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ измСнилось. Π’Π΅ΠΏΠ΅Ρ€ΡŒ *CPyDef\_sum* ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° *PyObject*, Π° структуры *CPyTagged*. Π­Ρ‚ΠΎ всС Π΅Ρ‰Π΅ Π½Π΅ *int*, Π½ΠΎ ΡƒΠΆΠ΅ ΠΈ Π½Π΅ Ρ‡Π°ΡΡ‚ΡŒ *CPython*, Π° Ρ‡Π°ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ mypyc, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ добавляСт Π² скомпилированный ΠΊΠΎΠ΄ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. Для Π΅Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅ сначала провСряСтся Ρ‚ΠΈΠΏ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ функция *sum* Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с *int* ΠΈ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Π½Π΅ получится. Π”Π°Π»Π΅Π΅ происходит Π²Ρ‹Π·ΠΎΠ² *CPyTaggetAdd* вмСсто *PyNumber\_Add*. Π­Ρ‚ΠΎ ΡƒΠΆΠ΅ **внутрСнняя функция mypyc**. Если Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² [ΠΊΠΎΠ΄](https://github.com/python/mypy/blob/5e20a26b922e2f5b71425ea7f57d2b4cba5a9324/mypyc/lib-rt/int_ops.c#L136) *CPyTaggetAdd*, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ происходит ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ *a* ΠΈ *b*, ΠΈ Ссли ΠΎΠ½ΠΈ ΡƒΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² int, Ρ‚ΠΎ происходит простоС суммированиС, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: ``` ``` Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, наш Π΄ΠΈΠ°Π»ΠΎΠ³ *CPython - Extension* прСвращаСтся **ΠΈΠ· абсурдного Π² Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ**: > β€” А посчитай-ΠΊΠ° ΠΌΠ½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sum для A, B; > > β€” Π₯ΠΎΡ€ΠΎΡˆΠΎ, Ρ‚ΠΎΠ³Π΄Π° Π΄Π΅Ρ€ΠΆΠΈ ΠΎΡ‚Π²Π΅Ρ‚ Π‘. ## Ѐункция bubble\_sort(data: List\[int\]) Настало врСмя Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сортировки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ провСсти Π·Π°ΠΌΠ΅Ρ€Ρ‹ скорости. ИзмСним Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ для *data*: ``` ``` Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈ Π·Π°ΠΌΠ΅Ρ€ΠΈΠΌ врСмя сортировки: | | | | |---|---|---| | Π‘Π΅Π· компиляции | Π‘ компиляциСй, Π±Π΅Π· Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² | Π‘ компиляциСй ΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ Ρ‚ΠΈΠΏΠΎΠ² | | real 5.68user 5.60sys 0.01 | real 2.78user 2.73sys 0.01 | real 1.32user 1.30sys 0.01 | Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π΅Ρ‰Π΅ Π΄Π²ΡƒΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ ускорСниС ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ скомпилированного, Π½Π΅ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ…ΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ\! ![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/1a6/2b9/4e6/1a62b94e684142f6991bf6637ef9ed81) ## ΠŸΠ°Ρ€Π° слов ΠΎ mypyc Если Π²Ρ‹ ΡƒΠΆΠ΅ Π±Ρ€ΠΎΡΠΈΠ»ΠΈΡΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ваши ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, Ρ‚ΠΎ стоит Π·Π°Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠ°Ρ€Ρƒ ΠΌΠΈΠ½ΡƒΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ этот Π°Π±Π·Π°Ρ† Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°. Π“Π»Π°Π²Π½Ρ‹ΠΌ нСдостатком *mypyc* ΠΏΠΎΠΊΠ° остаСтся ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ: ΠΎΠ½ всС Π΅Ρ‰Π΅ Π² Π°Π»ΡŒΡ„Π΅, Ρ‚ΠΎΡ‡Π½Π΅Π΅, сСйчас это Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π° Ρ‡Π°ΡΡ‚ΡŒ *mypy*. БобствСнно ΠΎΠ½ ΠΈ создавался ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄ Π·Π°Π΄Π°Ρ‡Ρƒ увСличСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ *mypy* ΠΈ для этой Ρ†Π΅Π»ΠΈ ΠΎΠ½ ΡƒΠΆΠ΅ **Π±ΠΎΠ»Π΅Π΅ Π³ΠΎΠ΄Π° ΠΊΠ°ΠΊ стабилСн**. Но ΠΊΠ°ΠΊ ΠΎΠ±Ρ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ компиляции любого python-ΠΊΠΎΠ΄Π°, ΠΎΠ½ Π΅Ρ‰Π΅ сыроват, ΠΎ Ρ‡Π΅ΠΌ Π°Π²Ρ‚ΠΎΡ€Ρ‹ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‚ Π½Π° страницС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’Π°ΠΊΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ограничСния, Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ Π½Π° ΠΊΠΎΠ΄, Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ со скомпилированным: - ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ² Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅; - Π’ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ ΠΊΠΎΠ΄Π΅ запрСщаСтся monkey patching; - Mypy Ρ…Ρ€Π°Π½ΠΈΡ‚ классы Π² Π‘ структурах для увСличСния скорости доступа ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ, Π½ΠΎ это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ совмСстимости. Π­Ρ‚ΠΈ ограничСния носят **ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ** Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ слСдствиСм Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ компилятора. Но ΠΈΠ· Π½ΠΈΡ… ΠΏΡ€ΠΎΠΈΡΡ‚Π΅ΠΊΠ°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ограничСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования модуля стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ abc. Помимо этого, Π΅ΡΡ‚ΡŒ большая порция Π½Π΅Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΎΠΊ ΠΈ Π±Π°Π³ΠΎΠ². Π§Π°Ρ‰Π΅ всСго ΠΎΠ½ΠΈ приводят ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ *gcc* отказываСтся ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π‘ ΠΊΠΎΠ΄, ΠΏΡ€ΠΈ этом, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π½Π°ΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ошибки, приходится ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π² Π³ΠΎΠ»ΠΎΠ²Π΅ Π½Π΅ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ рСвСрс ΠΈΠ½ΠΆΠΈΠ½ΠΈΡ€ΠΈΠ½Π³Π°. Пока Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚Π°ΠΊΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ компиляции ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠΎΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ **20 % ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ**, Π·Π°Ρ‚ΠΎ ΠΊΠ°ΠΊΠΈΡ… Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΡƒΠΆΠ΅ скомпилированными модулями я Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ». Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, большая Ρ‡Π°ΡΡ‚ΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ Π² ΠΈΡ… *Roadmap* Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°, ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ готовится ΠΊ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΌΡƒ [Ρ€Π΅Π»ΠΈΠ·Ρƒ](https://github.com/mypyc/mypyc/issues/780). ## Nuitka Π£ΠΆΠ΅ Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ ΡΡ‚Π°Ρ‚ΡŒΠ΅ΠΉ, я ΡƒΠ·Π½Π°Π» ΠΏΡ€ΠΎ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌΠΈ цСлями. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ [Nuitka](https://nuitka.net/) сильно Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ описанный Π²Ρ‹ΡˆΠ΅. Π Π°Π·Π½ΠΈΡ†Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ *Nuitka* ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Python ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² Π‘++ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ собираСтся Π² *Π‘Python Extension*. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ вСсь ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² **ΠΎΠ΄ΠΈΠ½ исполняСмый Ρ„Π°ΠΉΠ»**, Ρ‚ΠΎΠ³Π΄Π° ΡƒΠΆΠ΅ сам *CPython* ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΊΠ°ΠΊ динамичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° *libpython*. *Nuitka* ΠΏΠΎΠΊΠ° Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ², поэтому Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ зависят ΠΎΡ‚ наличия Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Π°Ρ ΠΆΠ΅ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π² ΠΌΠΎΠ΅ΠΌ тСстС **соотвСтствуСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ mypy** Π½Π° Π½Π΅ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. ## Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ НСдавно ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΉ ΠΊΠΎΠ»Π»Π΅Π³Π° высказал ΠΌΠ½Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ *mypy* **сильно услоТняСт** Π΅ΠΌΡƒ Тизнь: ΠΈΠ· тСкста ошибок Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, β€œΡ‡Π΅Π³ΠΎ ΠΎΠ½ ΠΎΡ‚ мСня хочСт”, Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠ· *PyCharm* Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ я понимаю, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅Π΄ΠΎΠΎΡ†Π΅Π½ΠΈΠ²Π°Π΅Ρ‚ *mypy*. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ **Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большСС, Ρ‡Π΅ΠΌ просто синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€**. По сути ΠΎΠ½ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ подмноТСство языка, ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π² ΠΏΠ»Π°Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ сильно прСвосходит ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ python. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ встраниваниС *mypy* Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° β€” инвСстиция Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² поиск ошибок, Π½ΠΎ ΠΈ **Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠΉ пСрфоманс** прилоТСния. МнС ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ взаимодСйствиС с *CPython* осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, вСдь это позволяСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π½Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, оставив Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Π’Π°ΠΊΠΎΠΉ ΠΏΡƒΡ‚ΡŒ прСдставляСтся ΠΌΠ½Π΅ **Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ бСзопасным** (учитывая, Ρ‡Ρ‚ΠΎ *mypyc* Π΄ΠΎ сих ΠΏΠΎΡ€ Π² Π°Π»ΡŒΡ„Π΅). ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈ *mypyc* Π½Π° ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅, Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π²Π°ΠΌ, Π½ΠΎ Ссли Π²Ρ‹ ΡƒΠΆΠ΅ ΡƒΠΏΠ΅Ρ€Π»ΠΈΡΡŒ Π² ΠΏΠΎΡ‚ΠΎΠ»ΠΎΠΊ ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΠΏΠΎΠ΄ΡƒΠΌΡ‹Π²Π°Π΅Ρ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ части Π½Π° Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ языки, Ρ‚ΠΎ стоит ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ *mypyc*, Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Ρ‡Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это просто, Ссли Π²Ρ‹ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ mypy. ## P.S. НадСюсь, Π²Π°ΠΌ Π±Ρ‹Π»ΠΎ интСрСсно ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Π½ΠΎΠ²ΠΎΠΌ способС ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ python, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π³Π»ΡƒΠ±ΠΆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ΅ компиляции динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Если Ρ‚Π΅ΠΌΠ° окаТСтся интСрСсной, Ρ‚ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽ большС Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ *mypyc*, Π΅Π³ΠΎ ограничСния ΠΈ частыС ошибки, Π° Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ. ## UPD Π’ коммСнтариях подсказали, ΠΎΠ± Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΌ python компиляторС - *Cython*, оказываСтся Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ python ΠΊΠΎΠ΄ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ (минуя Ρ€ΡƒΡ‡Π½ΡƒΡŽ Ρ„Π°Π·Ρƒ прСобразования ΠΊΠΎΠ΄Π° Π² *cython*\-ΠΊΠΎΠ΄). Будя ΠΏΠΎ Π·Π°ΠΌΠ΅Ρ€Π°ΠΌ cython ΠΏΠΎΠΊΠ° [Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚](https://github.com/cython/cython/issues/2587) Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ², Π½ΠΎ врСмя выполнСния (*real 1.82*) оказалось посСрСдинС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ mypyc Π½Π° Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΈ Π½Π΅ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π°. Но Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅Π΅ добавят Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ. Π’Π΅Π³ΠΈ: - [python](https://habr.com/ru/search/?target_type=posts&order=relevance&q=[python]) - [mypy](https://habr.com/ru/search/?target_type=posts&order=relevance&q=[mypy]) - [compiler](https://habr.com/ru/search/?target_type=posts&order=relevance&q=[compiler]) - [nuitka](https://habr.com/ru/search/?target_type=posts&order=relevance&q=[nuitka]) Π₯Π°Π±Ρ‹: - [Π‘Π»ΠΎΠ³ ΠΊΠΎΠΌΠΏΠ°Π½ΠΈΠΈ Exness](https://habr.com/ru/companies/exness/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/) \+27 162 [28](https://habr.com/ru/companies/exness/articles/542106/comments/) [![](https://habrastorage.org/getpro/habr/company/0d2/a3c/808/0d2a3c80845887b559d3602a5e085d5f.png)](https://habr.com/ru/companies/exness/profile/) [Exness](https://habr.com/ru/companies/exness/profile/) Tech professionals. Good people [Π₯Π°Π±Ρ€ ΠšΠ°Ρ€ΡŒΠ΅Ρ€Π°](https://career.habr.com/companies/exness)[Facebook](https://facebook.com/Exness.careers)[Instagram](https://instagram.com/exness_careers_) [![](https://habrastorage.org/getpro/habr/avatars/caa/9c9/cad/caa9c9cad82105a9a46f4848dbe4aa86.jpg)](https://habr.com/ru/users/zueve/) 15 ΠšΠ°Ρ€ΠΌΠ° EΠ²Π³Π΅Π½ΠΈΠΉ Π—ΡƒΠ΅Π²[@zueve](https://habr.com/ru/users/zueve/) Ѐилософия ΠΈ IT ΠŸΠΎΠ΄ΠΏΠΈΡΠ°Ρ‚ΡŒΡΡ Π₯Π°Π±Ρ€ доступСн 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) [ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ 28](https://habr.com/ru/companies/exness/articles/542106/comments/) ## ΠŸΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ Π›ΡƒΡ‡ΡˆΠΈΠ΅ Π·Π° сутки ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ ## Π˜Π½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡ Π‘Π°ΠΉΡ‚ [exness-careers.com](https://exness-careers.com/) Π”Π°Ρ‚Π° рСгистрации 12 фСвраля 2020 Π”Π°Ρ‚Π° основания 1 июля 2008 Π§ΠΈΡΠ»Π΅Π½Π½ΠΎΡΡ‚ΡŒ 1 001–5 000 Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊ ΠœΠ΅ΡΡ‚ΠΎΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠšΠΈΠΏΡ€ ΠŸΡ€Π΅Π΄ΡΡ‚Π°Π²ΠΈΡ‚Π΅Π»ΡŒ [Inna\_russa](https://habr.com/ru/users/Inna_russa/) Π’Π°Ρˆ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ - [Π’ΠΎΠΉΡ‚ΠΈ](https://habr.com/kek/v1/auth/habrahabr/?back=/ru/companies/exness/articles/542106/&hl=ru) - [РСгистрация](https://habr.com/kek/v1/auth/habrahabr-register/?back=/ru/companies/exness/articles/542106/&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/1e9/1ba/b49/1e91bab4996a417303df57b5b644da5b.jpg) ΠŸΡ€ΠΈΠ²Π΅Ρ‚, Π₯Π°Π±Ρ€\! Π― Ρ…ΠΎΡ‡Ρƒ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΎΠ± ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΠΌ событии, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ я ΡƒΠ·Π½Π°Π» ΠΏΠ°Ρ€Ρƒ мСсяцСв Π½Π°Π·Π°Π΄. ΠžΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ΡΡ, ΠΎΠ΄Π½Π° популярная python-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΡƒΠΆΠ΅ Π±ΠΎΠ»Π΅Π΅ Π³ΠΎΠ΄Π° распространяСтся Π² Π²ΠΈΠ΄Π΅ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ прямо ΠΈΠ· python. И Ρ€Π΅Ρ‡ΡŒ Π½Π΅ ΠΏΡ€ΠΎ Π±Π°Π½Π°Π»ΡŒΠ½ΡƒΡŽ ΡƒΠΏΠ°ΠΊΠΎΠ²ΠΊΡƒ ΠΊΠ°ΠΊΠΈΠΌ-Π½ΠΈΠ±ΡƒΠ΄ΡŒ *PyInstaller*\-ΠΎΠΌ, Π° ΠΏΡ€ΠΎ Ρ‡Π΅ΡΡ‚Π½ΡƒΡŽ *Ahead-of-time* ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Ρ†Π΅Π»ΠΎΠ³ΠΎ python-ΠΏΠ°ΠΊΠ΅Ρ‚Π°. Если Π²Ρ‹ ΡƒΠ΄ΠΈΠ²Π»Π΅Π½Ρ‹ Ρ‚Π°ΠΊ ΠΆΠ΅ ΠΊΠ°ΠΊ ΠΈ я, Π΄ΠΎΠ±Ρ€ΠΎ ΠΏΠΎΠΆΠ°Π»ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ΄ ΠΊΠ°Ρ‚. Объясню, ΠΏΠΎΡ‡Π΅ΠΌΡƒ я ΡΡ‡ΠΈΡ‚Π°ΡŽ это событиС ΠΏΠΎ-настоящСму ΡƒΠ΄ΠΈΠ²ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌ. БущСствуСт Π΄Π²Π° Π²ΠΈΠ΄Π° компиляции: *Ahead-of-time (AOT)*, ΠΊΠΎΠ³Π΄Π° вСсь ΠΊΠΎΠ΄ компилируСтся Π΄ΠΎ запуска ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ *Just in time compiler (JIT)*, ΠΊΠΎΠ³Π΄Π° нСпосрСдствСнно компиляция ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΏΠΎΠ΄ Ρ‚Ρ€Π΅Π±ΡƒΠ΅ΠΌΡƒΡŽ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρƒ процСссора осущСствляСтся Π²ΠΎ врСмя Π΅Π΅ выполнСния. Π’ΠΎ Π²Ρ‚ΠΎΡ€ΠΎΠΌ случаС ΠΏΠ΅Ρ€Π²ΠΎΠ½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ запуск ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ осущСствляСтся Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΠΉ машиной ΠΈΠ»ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€ΠΎΠΌ. Если ΡΠ³Ρ€ΡƒΠΏΠΏΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ популярныС языки программирования ΠΏΠΎ Ρ‚ΠΈΠΏΡƒ компиляции, Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ список: - Ahead-of-time compiler: C, C++, Rust, Kotlin, Nim, D, Go, Dart; - Just in time compiler: Lua, Π‘\#, Groovy, Dart. *Π’ python ΠΈΠ· ΠΊΠΎΡ€ΠΎΠ±ΠΊΠΈ Π½Π΅Ρ‚ JIT компилятора, Π½ΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΡ€Π΅Π΄ΠΎΡΡ‚Π°Π²Π»ΡΡŽΡ‰ΠΈΠ΅ Ρ‚Π°ΠΊΡƒΡŽ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ, ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ Π΄Π°Π²Π½ΠΎ* Бмотря Π½Π° эту Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ: **статичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки находятся Π² ΠΎΠ±Π΅ΠΈΡ… строках**. НСкоторыС Π΄Π°ΠΆΠ΅ ΠΌΠΎΠ³ΡƒΡ‚ Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚ΡŒΡΡ с двумя вСрсиями компиляторов: Kotlin ΠΌΠΎΠΆΠ΅Ρ‚ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ ΠΊΠ°ΠΊ с JIT JavaVM, Ρ‚Π°ΠΊ ΠΈ с AOT Kotlin/Native. Π’ΠΎ ΠΆΠ΅ самоС ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ Dart (вСрсии 2). A Π²ΠΎΡ‚ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ JIT-ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π²ΠΏΡ€ΠΎΡ‡Π΅ΠΌ Π²ΠΏΠΎΠ»Π½Π΅ Π»ΠΎΠ³ΠΈΡ‡Π½ΠΎ. > *ΠŸΡ€ΠΈ запускС Π²ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина сначала Π½Π°ΠΊΠ°ΠΏΠ»ΠΈΠ²Π°Π΅Ρ‚ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Π·Π°Ρ‚Π΅ΠΌ послС накоплСния статистики, запускаСтся компиляция Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π½Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… частСй ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. Π’ΠΈΡ€Ρ‚ΡƒΠ°Π»ΡŒΠ½Π°Ρ машина отслСТиваСт Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΈ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΌΠ΅ΠΆΠ΄Ρƒ ΡƒΠΆΠ΅ скомпилированными ΠΈ Π½Π΅ скомпилированными участками ΠΊΠΎΠ΄Π° Π² зависимости ΠΎΡ‚ Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ….* ΠŸΡ€ΠΈ использовании JIT компиляции Ρ‚ΠΈΠΏΡ‹ Π½Π΅ ΠΎΡ‡Π΅Π½ΡŒ Ρ‚ΠΎ ΠΈ Π½ΡƒΠΆΠ½Ρ‹, вСдь информация ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… собираСтся Π²ΠΎ врСмя Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ всС популярныС динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ языки программирования Ρ€Π°ΡΠΏΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡŽΡ‚ΡΡ ΠΈΠΌΠ΅Π½Π½ΠΎ с JIT компилятором. **Но ΠΊΠ°ΠΊ Π±Ρ‹Ρ‚ΡŒ с AOT компиляциСй ΠΊΠΎΠ΄Π°, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ Π½Π΅Ρ‚ Ρ‚ΠΈΠΏΠΎΠ²?** МСня ΠΎΡ‡Π΅Π½ΡŒ заинтСрСсовал этот вопрос, ΠΈ я ΠΏΠΎΠ»Π΅Π· Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ. Π˜Ρ‚Π°ΠΊ, вСрнСмся ΠΊ ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π΅, ΠΎ ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π³ΠΎΠ²ΠΎΡ€ΠΈΠ»ΠΎΡΡŒ Π² Π½Π°Ρ‡Π°Π»Π΅ ΡΡ‚Π°Ρ‚ΡŒΠΈ. Π Π΅Ρ‡ΡŒ ΠΏΡ€ΠΎ [mypy](http://mypy-lang.org/) - Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ популярный синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ python-ΠΊΠΎΠ΄Π°. ![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/6f3/fb7/42d/6f3fb742d999b54bb8d8bfc3daf1c923) Π‘ апрСля 2019 Π³ΠΎΠ΄Π° эта ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° распространяСтся Π² скомпилированном Π²ΠΈΠ΄Π΅, ΠΎ Ρ‡Π΅ΠΌ рассказываСтся Π² [Π±Π»ΠΎΠ³Π΅](https://mypy-lang.blogspot.com/2019/04/mypy-0700-released-up-to-4x-faster.html) ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. А для компиляции ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Π° ΠΎΡ‚ Ρ‚Π΅Ρ… ΠΆΠ΅ Π°Π²Ρ‚ΠΎΡ€ΠΎΠ² β€” *mypyc*. ΠŸΠΎΠ³ΡƒΠ³Π»ΠΈΠ² Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ, я нашСл достаточно Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ ΡΡ‚Π°Ρ‚ΡŒΡŽ β€œ[ΠŸΡƒΡ‚ΡŒ ΠΊ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ΅ Ρ‚ΠΈΠΏΠΎΠ² 4 ΠΌΠΈΠ»Π»ΠΈΠΎΠ½ΠΎΠ² строк Python-ΠΊΠΎΠ΄Π°](https://dropbox.tech/application/our-journey-to-type-checking-4-million-lines-of-python)” ΠΏΡ€ΠΎ становлСниС ΠΈ Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠ΅ mypy (Π½Π° Π₯Π°Π±Ρ€Π΅ доступСн ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄: [Ρ‡Π°ΡΡ‚ΡŒ 1](https://habr.com/ru/company/ruvds/blog/468233/), [Ρ‡Π°ΡΡ‚ΡŒ 2](https://habr.com/ru/company/ruvds/blog/468235/), [Ρ‡Π°ΡΡ‚ΡŒ 3](https://habr.com/ru/company/ruvds/blog/468237/)). Π’Π°ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ рассказываСтся ΠΎ цСлях создания mypyc: ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ²ΡˆΠΈΡΡŒ с нСдостаточной ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ mypy ΠΏΡ€ΠΈ Ρ€Π°Π·Π±ΠΎΡ€Π΅ ΠΊΡ€ΡƒΠΏΠ½Ρ‹Ρ… python-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ² Π² Dropbox, Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ ΠΊΠ΅ΡˆΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠ² ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ ΠΊΠΎΠ΄Π°, Π° Π·Π°Ρ‚Π΅ΠΌ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ запуска ΡƒΡ‚ΠΈΠ»ΠΈΡ‚Ρ‹ ΠΊΠ°ΠΊ сСрвиса. Но исчСрпав ΠΎΡ‡Π΅Π²ΠΈΠ΄Π½Ρ‹Π΅ возмоТности ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, ΡΡ‚ΠΎΠ»ΠΊΠ½ΡƒΠ»ΠΈΡΡŒ с Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ: ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ всС Π½Π° *go* ΠΈΠ»ΠΈ Π½Π° *cython*. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ пошСл ΠΏΠΎ Ρ‚Ρ€Π΅Ρ‚ΡŒΠ΅ΠΌΡƒ ΠΏΡƒΡ‚ΠΈ β€” **написаниС своСго AOT python-компилятора**. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ для ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎΠΉ Ρ€Π°Π±ΠΎΡ‚Ρ‹ *mypy* ΠΈ Ρ‚Π°ΠΊ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΠΏΠΎΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ Ρ‚ΠΎ ΠΆΠ΅ синтаксичСскоС Π΄Π΅Ρ€Π΅Π²ΠΎ, Ρ‡Ρ‚ΠΎ ΠΈ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ Π²ΠΎ врСмя исполнСния ΠΊΠΎΠ΄Π°. Π’ΠΎ Π΅ΡΡ‚ΡŒ **mypy ΡƒΠΆΠ΅ β€œΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚β€ python**, Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для статистичСского Π°Π½Π°Π»ΠΈΠ·Π°, Π° Π²ΠΎΡ‚ *mypyc* ΠΌΠΎΠΆΠ΅Ρ‚ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Ρ‹Π²Π°Ρ‚ΡŒ эту ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ Π² ΠΏΠΎΠ»Π½ΠΎΡ†Π΅Π½Π½Ρ‹ΠΉ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ ΠΊΠΎΠ΄. Π”ΡƒΠΌΠ°ΡŽ Ρ‚ΡƒΡ‚ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ Ρ€Π΅ΡˆΠΈΠ»ΠΈ, Ρ‡Ρ‚ΠΎ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ Π² вопросС Ρ‚ΠΎΠ³ΠΎ, ΠΊΠ°ΠΊ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ python-ΠΊΠΎΠ΄. Python c вСрсии 3.4 ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ², Π° *mypy* ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ коррСктности Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ. ΠŸΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ΡΡ, python ΠΊΠ°ΠΊ Π±Ρ‹ ΡƒΠΆΠ΅ ΠΈ Π½Π΅ динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ язык, Ρ‡Ρ‚ΠΎ позволяСт ΠΏΡ€ΠΈΠΌΠ΅Π½ΠΈΡ‚ΡŒ AOT ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ. Но Π·Π°Π³Π²ΠΎΠ·Π΄ΠΊΠ° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ *mypyc* **ΠΌΠΎΠΆΠ΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Π½Π΅Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΊΠΎΠ΄**\! ## Ѐункция bubble\_sort Для ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π° рассмотрим Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ сортировки β€œΠΏΡƒΠ·Ρ‹Ρ€ΡŒΠΊΠΎΠΌβ€. Π€Π°ΠΉΠ» *lib.py:* ``` def bubble_sort(data): Β Β Β n = len(data) Β Β Β for i in range(n - 1): Β Β Β Β Β Β Β for j in range(n - i - 1): Β Β Β Β Β Β Β Β Β Β Β if data[j] > data[j + 1]: Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β buff = data[j] Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β data[j] = data[j + 1] Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β data[j + 1] = buff Β Β Β return data ``` Π£ Ρ‚ΠΈΠΏΠΎΠ² Π½Π΅Ρ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ, Π½ΠΎ это Π½Π΅ ΠΌΠ΅ΡˆΠ°Π΅Ρ‚ *mypyc* Π΅Π΅ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ. Π§Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ, Π½ΡƒΠΆΠ½ΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ *mypyc*. Он Π½Π΅ распространяСтся ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Ρ‹ΠΌ ΠΏΠ°ΠΊΠ΅Ρ‚ΠΎΠΌ, Π½ΠΎ Ссли Ρƒ вас установлСн *mypy*, Ρ‚ΠΎ ΠΈ *mypyc* ΡƒΠΆΠ΅ присутствуСт Π² систСмС! ЗапускаСм *mypyc*, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΊΠΎΠΌΠ°Π½Π΄ΠΎΠΉ: ``` > mypyc lib.py ``` ПослС запуска Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π΅ Π±ΡƒΠ΄ΡƒΡ‚ созданы ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΎΡ€ΠΈΠΈ: - `.mypy_cache` β€” *mypy* кэш, mypyc нСявно запускаСт mypy для Ρ€Π°Π·Π±ΠΎΡ€Π° ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΡ‹ ΠΈ получСния AST; - `build` β€” Π°Ρ€Ρ‚Π΅Ρ„Π°ΠΊΡ‚Ρ‹ сборки; - `lib.cpython-38-x86_64-linux-gnu.so` β€” собствСнно сборка ΠΏΠΎΠ΄ Ρ†Π΅Π»Π΅Π²ΡƒΡŽ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ. Π”Π°Π½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» прСдставляСт ΠΈΠ· сСбя Π³ΠΎΡ‚ΠΎΠ²Ρ‹ΠΉ CPython Extension. > *CPython Extension* β€” встроСнный Π² *CPython* ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ взаимодСйствия с ΠΊΠΎΠ΄ΠΎΠΌ, написанным Π½Π° Π‘/C++. По сути это динамичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ *CPython* ΡƒΠΌΠ΅Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΏΡ€ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅ нашСго модуля *lib*. Π§Π΅Ρ€Π΅Π· Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ осущСствляСтся взаимодСйствиС с модулями, написанными Π½Π° python. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ состоит ΠΈΠ· Π΄Π²ΡƒΡ… Ρ„Π°Π·: 1. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ python ΠΊΠΎΠ΄Π° Π² ΠΊΠΎΠ΄ Π‘; 2. ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡ Π‘ Π² Π±ΠΈΠ½Π°Ρ€Π½Ρ‹ΠΉ *.so* Ρ„Π°ΠΉΠ», для этого *mypyc* сам запускаСт gcc (*gcc* ΠΈ *python-dev* Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ установлСны). Π€Π°ΠΉΠ» `lib.cpython-38-x86_64-linux-gnu.so` ΠΈΠΌΠ΅Π΅Ρ‚ прСимущСство ΠΏΠ΅Ρ€Π΅Π΄ *lib.py* ΠΏΡ€ΠΈ ΠΈΠΌΠΏΠΎΡ€Ρ‚Π΅ Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΉ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅, ΠΈ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒΡΡ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ Π±ΡƒΠ΄Π΅Ρ‚ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΠ½. Ну ΠΈ Π΄Π°Π²Π°ΠΉΡ‚Π΅ сравним ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ модуля Π΄ΠΎ ΠΈ послС компиляции. Для этого создадим Ρ„Π°ΠΉΠ» *main.py* с ΠΊΠΎΠ΄ΠΎΠΌ запуска сортировки: ``` import lib data = lib.bubble_sort(list(range(5000, 0, -1))) assert data == list(range(1, 5001)) ``` ΠŸΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹: | | | |---|---| | Π”ΠΎ | ПослС | | real 5.68user 5.60sys 0.01 | real 2.78user 2.73sys 0.01 | ОТидаСмо скомпилированный ΠΊΠΎΠ΄ **оказался быстрСС (~ Π² 2 Ρ€Π°Π·Π°)**, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΏΠ»ΠΎΡ…ΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ для Ρ‚Π°ΠΊΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π° Π½Π°ΠΌ ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ лишь ΠΎΠ΄Π½Ρƒ ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ. Π₯отя ΠΎΡ‚ скомпилированного ΠΊΠΎΠ΄Π° ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½ΠΎ оТидаСшь большСго. ![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/5a3/bbe/285/5a3bbe28516bfd798ed394c0e46afaf7) Π§Ρ‚ΠΎΠ±Ρ‹ ΠΎΡ‚Π²Π΅Ρ‚ΠΈΡ‚ΡŒ Π½Π° вопрос *β€œΠΊΠ°ΠΊ компилируСтся динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ код”*, придСтся Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² прСдставлСниС этой Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π½Π° Π‘. Но Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒ Π΅Π΅ Π±ΡƒΠ΄Π΅Ρ‚ достаточно слоТно, поэтому Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ с ΠΏΡ€ΠΈΠΌΠ΅Ρ€ΠΎΠΌ ΠΏΠΎΠΏΡ€ΠΎΡ‰Π΅. ## Ѐункция sum(a, b) Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ суммы ΠΎΡ‚ Π΄Π²ΡƒΡ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…: ``` def sum(a, b): Β Β return a + b ``` ΠŸΠ΅Ρ€Π΅Π΄ запуском компиляции я ΠΎΠΆΠΈΠ΄Π°Π» ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ Π½Π° Π‘: ``` int sum(int a, int b) { Β Β Β return a + b; } ``` Однако Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ оказался cущСствСнно ΠΈΠ½Ρ‹ΠΌ (**ΠΊΠΎΠ΄ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠΏΡ€ΠΎΡ‰Π΅Π½**): ``` PyObject *CPyDef_sum(PyObject *cpy_r_a, PyObject *cpy_r_b){ Β Β Β Β return PyNumber_Add(cpy_r_a, cpy_r_b); } ``` Рассмотрим, Ρ‡Ρ‚ΠΎ Ρ‚ΡƒΡ‚ происходит. Π’ΠΎ-ΠΏΠ΅Ρ€Π²Ρ‹Ρ…, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΌΡ‹ Π½Π΅ Π·Π½Π°Π΅ΠΌ Ρ‚ΠΈΠΏΡ‹ Π²Ρ…ΠΎΠ΄Π½Ρ‹Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, функция Π² качСствС Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² ΠΏΡ€ΠΈΠ½ΠΈΠΌΠ°Π΅Ρ‚ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹ класса *PyObject*, ΠΏΠΎ сути это Π²Π½ΡƒΡ‚Ρ€Π΅Π½Π½ΠΈΠ΅ *CPython* структуры. Π”Π°Π»Π΅Π΅ **компилятор Π΄ΠΎΠ»ΠΆΠ΅Π½ ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ эти ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹**, Π½ΠΎ ΠΊΠ°ΠΊ, Ссли настоящиС Ρ‚ΠΈΠΏΡ‹ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚ΠΎΠ² нСизвСстны Π²ΠΎ врСмя компиляции: это ΠΌΠΎΠ³ΡƒΡ‚ Π±Ρ‹Ρ‚ΡŒ Ρ†Π΅Π»Ρ‹Π΅ числа, числа с ΠΏΠ»Π°Π²Π°ΡŽΡ‰Π΅ΠΉ Ρ‚ΠΎΡ‡ΠΊΠΎΠΉ, списки ΠΈ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Ρ„Π°ΠΊΡ‚, Ρ‡Ρ‚ΠΎ Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ ΠΌΠΎΠΆΠ½ΠΎ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ, Ρ‚ΠΎΠ³Π΄Π° Π½ΡƒΠΆΠ½ΠΎ Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ ΠΎΡˆΠΈΠ±ΠΊΡƒ. И Ρ‡Ρ‚ΠΎ ΠΆΠ΅ Π΄Π΅Π»Π°Π΅Ρ‚ Π² этом случаС mypyc? Как оказалось, всС ΠΎΡ‡Π΅Π½ΡŒ просто: ΠΎΠ½ просит *CPython* ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ ΡΠ»ΠΎΠΆΠΈΡ‚ΡŒ эти Π°Ρ€Π³ΡƒΠΌΠ΅Π½Ρ‚Ρ‹. Ѐункция *PyNumber\_Add* β€” это внутрСнняя функция *Π‘Python*, которая доступна ΠΈΠ· Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ, вСдь ***Π‘Python* ΠΎΡ‚Π»ΠΈΡ‡Π½ΠΎ ΡƒΠΌΠ΅Π΅Ρ‚ ΡΠΊΠ»Π°Π΄Ρ‹Π²Π°Ρ‚ΡŒ свои ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Ρ‹**. ВзаимодСйствиС CPython c Extension ΠΌΠΎΠΆΠ½ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°Π·ΠΈΡ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ Π΄ΠΈΠ°Π»ΠΎΠ³ΠΎΠΌ: > β€” А посчитай-ΠΊΠ° ΠΌΠ½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sum для A, B; > > β€” Π₯ΠΎΡ€ΠΎΡˆΠΎ, Π½ΠΎ скаТи сначала, сколько Π±ΡƒΠ΄Π΅Ρ‚ A + B; > > β€” Π‘ΡƒΠ΄Π΅Ρ‚ Π‘; > > β€” Π₯ΠΎΡ€ΠΎΡˆΠΎ, Ρ‚ΠΎΠ³Π΄Π° Π΄Π΅Ρ€ΠΆΠΈ ΠΎΡ‚Π²Π΅Ρ‚ - Π‘. Π’ΠΎΡ‚ Ρ‚Π°ΠΊΠΎΠΉ Π½Π΅Ρ…ΠΈΡ‚Ρ€Ρ‹ΠΉ ΠΏΡ€ΠΈΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΏΡ€ΠΈ компиляции динамичСского ΠΊΠΎΠ΄Π°: **ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ всС, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ, Π° всС ΠΎΡΡ‚Π°Π»ΡŒΠ½ΠΎΠ΅ ΠΎΡ‚Π΄Π°Π΅ΠΌ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Ρƒ**. ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΈΠΌΠ΅Ρ€ выглядит гротСскно, Π½ΠΎ Π΄Π°ΠΆΠ΅ **нСсмотря Π½Π° Ρ‚Π°ΠΊΡƒΡŽ Π½Π΅ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ**, mypyc позволяСт Π΄ΠΎΠ±ΠΈΡ‚ΡŒΡΡ сущСствСнного **прироста ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ**, ΠΊΠ°ΠΊ Π² ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π΅ с сортировкой. ## Ѐункция sum(a: int, b: int) Π˜Ρ‚Π°ΠΊ, Ρƒ нас ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ ΡΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ python, ΠΈ ΠΌΡ‹ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Π»ΠΈΡΡŒ с Ρ‚Π΅ΠΌ, ΠΊΠ°ΠΊ это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΡƒΡŽ Π½Π΅ΡΡ„Ρ„Π΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½ΠΎΠ³ΠΎ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π°. Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ это ΡƒΠ»ΡƒΡ‡ΡˆΠΈΡ‚ΡŒ. ΠžΡ‡Π΅Π²ΠΈΠ΄Π½ΠΎ, Ρ‡Ρ‚ΠΎ основная ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π²ΠΎ **мноТСствСнном взаимодСйствии** *CPython - Extension*. Но ΠΊΠ°ΠΊ это ΠΏΠΎΠ±ΠΎΡ€ΠΎΡ‚ΡŒ? Для ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ эффСктивности, Π½ΡƒΠΆΠ½ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ² ΡƒΠΏΡ€Π°Π²Π»Π΅Π½ΠΈΠ΅, ΠΌΠΎΠ³Π»ΠΎ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ **дольшС ΠΎΡΡ‚Π°Π²Π»ΡΡ‚ΡŒ Π΅Π³ΠΎ Ρƒ сСбя** Π±Π΅Π· обращСния ΠΊ *CPython*. Если Π±Ρ‹ Ρƒ mypyc Π±Ρ‹Π»Π° информация ΠΎ Ρ‚ΠΈΠΏΠ°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ…, Ρ‚ΠΎ ΠΎΠ½ Π±Ρ‹ ΠΌΠΎΠ³ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ произвСсти слоТСниС Π±Π΅Π· Π²ΠΎΠ·Π²Ρ€Π°Ρ‚Π° управлСния. Но вывСсти Ρ‚ΠΈΠΏΡ‹ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ mypyc Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚, ΠΎΠ½ Π΄Π°ΠΆΠ΅ **Π½Π΅ ΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠΎΠ΄**, ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ осущСствляСтся Π²Ρ‹Π·ΠΎΠ² Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ sum. БоотвСтствСнно, Π΅ΠΌΡƒ Π½ΡƒΠΆΠ½ΠΎ ΠΏΠΎΠΌΠΎΡ‡ΡŒ, проставив Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Π²Ρ€ΡƒΡ‡Π½ΡƒΡŽ. Π”Π°Π²Π°ΠΉΡ‚Π΅ посмотрим, ΠΊΠ°ΠΊ помСняСтся Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰Π°Ρ Π‘-функция, Ссли Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ²: ``` def sum(a: int, b: int): Β Β return a + b ``` Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Π½Π° C (*Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΎΡ‡ΠΈΡ‰Π΅Π½Π½Ρ‹ΠΉ*): ``` PyObject *CPyDef_sum(CPyTagged cpy_r_a, CPyTagged cpy_r_b) { Β Β Β CPyTagged cpy_r_r0; Β Β Β PyObject *cpy_r_r1; Β Β Β cpy_r_r0 = CPyTagged_Add(cpy_r_a, cpy_r_b); Β Β Β cpy_r_r1 = CPyTagged_StealAsObject(cpy_r_r0); Β Β Β return cpy_r_r1; } ``` Π“Π»Π°Π²Π½ΠΎΠ΅, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ: **функция сущСствСнно помСнялась**, Π° Π·Π½Π°Ρ‡ΠΈΡ‚, компилятор Ρ€Π΅Π°Π³ΠΈΡ€ΡƒΠ΅Ρ‚ Π½Π° появлСниС Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ. Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ измСнилось. Π’Π΅ΠΏΠ΅Ρ€ΡŒ *CPyDef\_sum* ΠΏΠΎΠ»ΡƒΡ‡Π°Π΅Ρ‚ Π½Π° Π²Ρ…ΠΎΠ΄ Π½Π΅ ΡƒΠΊΠ°Π·Π°Ρ‚Π΅Π»ΠΈ Π½Π° *PyObject*, Π° структуры *CPyTagged*. Π­Ρ‚ΠΎ всС Π΅Ρ‰Π΅ Π½Π΅ *int*, Π½ΠΎ ΡƒΠΆΠ΅ ΠΈ Π½Π΅ Ρ‡Π°ΡΡ‚ΡŒ *CPython*, Π° Ρ‡Π°ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ mypyc, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΎΠ½ добавляСт Π² скомпилированный ΠΊΠΎΠ΄ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΡ. Для Π΅Π΅ ΠΈΠ½ΠΈΡ†ΠΈΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅ сначала провСряСтся Ρ‚ΠΈΠΏ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ функция *sum* Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ с *int* ΠΈ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Π½Π΅ получится. Π”Π°Π»Π΅Π΅ происходит Π²Ρ‹Π·ΠΎΠ² *CPyTaggetAdd* вмСсто *PyNumber\_Add*. Π­Ρ‚ΠΎ ΡƒΠΆΠ΅ **внутрСнняя функция mypyc**. Если Π·Π°Π³Π»ΡΠ½ΡƒΡ‚ΡŒ Π² [ΠΊΠΎΠ΄](https://github.com/python/mypy/blob/5e20a26b922e2f5b71425ea7f57d2b4cba5a9324/mypyc/lib-rt/int_ops.c#L136) *CPyTaggetAdd*, Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΌ происходит ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π΄ΠΈΠ°ΠΏΠ°Π·ΠΎΠ½ΠΎΠ² Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ *a* ΠΈ *b*, ΠΈ Ссли ΠΎΠ½ΠΈ ΡƒΠΊΠ»Π°Π΄Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² int, Ρ‚ΠΎ происходит простоС суммированиС, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Π½Π° ΠΏΠ΅Ρ€Π΅ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅: ``` if (likely(CPyTagged_CheckShort(left) && CPyTagged_CheckShort(right))) { Β Β Β Β CPyTagged sum = left + right; Β Β Β Β if (likely(!CPyTagged_IsAddOverflow(sum, left, right))) { Β Β Β Β Β Β Β Β return sum; Β Β Β Β } } ``` Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, наш Π΄ΠΈΠ°Π»ΠΎΠ³ *CPython - Extension* прСвращаСтся **ΠΈΠ· абсурдного Π² Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ**: > β€” А посчитай-ΠΊΠ° ΠΌΠ½Π΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ sum для A, B; > > β€” Π₯ΠΎΡ€ΠΎΡˆΠΎ, Ρ‚ΠΎΠ³Π΄Π° Π΄Π΅Ρ€ΠΆΠΈ ΠΎΡ‚Π²Π΅Ρ‚ Π‘. ## Ѐункция bubble\_sort(data: List\[int\]) Настало врСмя Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒΡΡ ΠΊ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ сортировки, Ρ‡Ρ‚ΠΎΠ±Ρ‹ провСсти Π·Π°ΠΌΠ΅Ρ€Ρ‹ скорости. ИзмСним Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΡŽ, Π΄ΠΎΠ±Π°Π²ΠΈΠ² Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ для *data*: ``` def bubble_sort(data: List[int]):     … ``` Π‘ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ ΠΈ Π·Π°ΠΌΠ΅Ρ€ΠΈΠΌ врСмя сортировки: | | | | |---|---|---| | Π‘Π΅Π· компиляции | Π‘ компиляциСй, Π±Π΅Π· Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΈ Ρ‚ΠΈΠΏΠΎΠ² | Π‘ компиляциСй ΠΈ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠ΅ΠΉ Ρ‚ΠΈΠΏΠΎΠ² | | real 5.68user 5.60sys 0.01 | real 2.78user 2.73sys 0.01 | real 1.32user 1.30sys 0.01 | Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΈ Π΅Ρ‰Π΅ Π΄Π²ΡƒΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ ускорСниС ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ скомпилированного, Π½Π΅ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΈ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅Ρ…ΠΊΡ€Π°Ρ‚Π½ΠΎΠ΅ ΠΎΡ‚Π½ΠΎΡΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ\! ![](https://habrastorage.org/r/w1560/getpro/habr/upload_files/1a6/2b9/4e6/1a62b94e684142f6991bf6637ef9ed81) ## ΠŸΠ°Ρ€Π° слов ΠΎ mypyc Если Π²Ρ‹ ΡƒΠΆΠ΅ Π±Ρ€ΠΎΡΠΈΠ»ΠΈΡΡŒ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ваши ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹, Ρ‚ΠΎ стоит Π·Π°Π΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒΡΡ Π½Π° ΠΏΠ°Ρ€Ρƒ ΠΌΠΈΠ½ΡƒΡ‚, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΡ‡ΠΈΡ‚Π°Ρ‚ΡŒ этот Π°Π±Π·Π°Ρ† Π΄ΠΎ ΠΊΠΎΠ½Ρ†Π°. Π“Π»Π°Π²Π½Ρ‹ΠΌ нСдостатком *mypyc* ΠΏΠΎΠΊΠ° остаСтся ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΡΡ‚ΡŒ: ΠΎΠ½ всС Π΅Ρ‰Π΅ Π² Π°Π»ΡŒΡ„Π΅, Ρ‚ΠΎΡ‡Π½Π΅Π΅, сСйчас это Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, Π° Ρ‡Π°ΡΡ‚ΡŒ *mypy*. БобствСнно ΠΎΠ½ ΠΈ создавался ΡΠΏΠ΅Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄ Π·Π°Π΄Π°Ρ‡Ρƒ увСличСния ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ *mypy* ΠΈ для этой Ρ†Π΅Π»ΠΈ ΠΎΠ½ ΡƒΠΆΠ΅ **Π±ΠΎΠ»Π΅Π΅ Π³ΠΎΠ΄Π° ΠΊΠ°ΠΊ стабилСн**. Но ΠΊΠ°ΠΊ ΠΎΠ±Ρ‰Π΅Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΏΠΎ компиляции любого python-ΠΊΠΎΠ΄Π°, ΠΎΠ½ Π΅Ρ‰Π΅ сыроват, ΠΎ Ρ‡Π΅ΠΌ Π°Π²Ρ‚ΠΎΡ€Ρ‹ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π°ΡŽΡ‚ Π½Π° страницС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°. Π’Π°ΠΊΠΆΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ ограничСния, Π½Π°ΠΊΠ»Π°Π΄Ρ‹Π²Π°Π΅ΠΌΡ‹Π΅ Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ΄ ΠΈΠ»ΠΈ Π½Π° ΠΊΠΎΠ΄, Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ со скомпилированным: - ΠŸΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½Π°Ρ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° Ρ‚ΠΈΠΏΠΎΠ² Π² Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ΅; - Π’ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅ΠΌΠΎΠΌ ΠΊΠΎΠ΄Π΅ запрСщаСтся monkey patching; - Mypy Ρ…Ρ€Π°Π½ΠΈΡ‚ классы Π² Π‘ структурах для увСличСния скорости доступа ΠΊ Π°Ρ‚Ρ€ΠΈΠ±ΡƒΡ‚Π°ΠΌ, Π½ΠΎ это ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌ совмСстимости. Π­Ρ‚ΠΈ ограничСния носят **ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ** Ρ…Π°Ρ€Π°ΠΊΡ‚Π΅Ρ€ ΠΈ ΡΠ²Π»ΡΡŽΡ‚ΡΡ слСдствиСм Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ компилятора. Но ΠΈΠ· Π½ΠΈΡ… ΠΏΡ€ΠΎΠΈΡΡ‚Π΅ΠΊΠ°ΡŽΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ ограничСния, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ использования модуля стандартной Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ abc. Помимо этого, Π΅ΡΡ‚ΡŒ большая порция Π½Π΅Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΎΠΊ ΠΈ Π±Π°Π³ΠΎΠ². Π§Π°Ρ‰Π΅ всСго ΠΎΠ½ΠΈ приводят ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΠΊΠΎΠ΄ *gcc* отказываСтся ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠ»ΡƒΡ‡Π΅Π½Π½Ρ‹ΠΉ Π‘ ΠΊΠΎΠ΄, ΠΏΡ€ΠΈ этом, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ Π½Π°ΡΡ‚ΠΎΡΡ‰ΡƒΡŽ ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρƒ ошибки, приходится ΠΏΡ€ΠΎΠΊΡ€ΡƒΡ‡ΠΈΠ²Π°Ρ‚ΡŒ Π² Π³ΠΎΠ»ΠΎΠ²Π΅ Π½Π΅ΠΏΡ€ΠΎΡΡ‚ΡƒΡŽ ΠΏΡ€ΠΎΡ†Π΅Π΄ΡƒΡ€Ρƒ рСвСрс ΠΈΠ½ΠΆΠΈΠ½ΠΈΡ€ΠΈΠ½Π³Π°. Пока Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Ρ‚Π°ΠΊΠΎΠ², Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈ компиляции ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΌΠΎΠΈΡ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², Π±Π΅Π· ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Π»ΠΎΡΡŒ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ **20 % ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ**, Π·Π°Ρ‚ΠΎ ΠΊΠ°ΠΊΠΈΡ… Π»ΠΈΠ±ΠΎ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ Ρ€Π°Π±ΠΎΡ‚Π΅ с ΡƒΠΆΠ΅ скомпилированными модулями я Π½Π΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ». Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, большая Ρ‡Π°ΡΡ‚ΡŒ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠΉ Π² ΠΈΡ… *Roadmap* Π·Π°ΠΊΡ€Ρ‹Ρ‚Π°, ΠΈ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ готовится ΠΊ ΠΏΡƒΠ±Π»ΠΈΡ‡Π½ΠΎΠΌΡƒ [Ρ€Π΅Π»ΠΈΠ·Ρƒ](https://github.com/mypyc/mypyc/issues/780). ## Nuitka Π£ΠΆΠ΅ Π² процСссС Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π°Π΄ ΡΡ‚Π°Ρ‚ΡŒΠ΅ΠΉ, я ΡƒΠ·Π½Π°Π» ΠΏΡ€ΠΎ Π΅Ρ‰Π΅ ΠΎΠ΄ΠΈΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ с Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹ΠΌΠΈ цСлями. ΠœΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°Π±ΠΎΡ‚Ρ‹ [Nuitka](https://nuitka.net/) сильно Π½Π°ΠΏΠΎΠΌΠΈΠ½Π°Π΅Ρ‚ описанный Π²Ρ‹ΡˆΠ΅. Π Π°Π·Π½ΠΈΡ†Π° Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ *Nuitka* ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΡƒΠ΅Ρ‚ Python ΠΌΠΎΠ΄ΡƒΠ»ΡŒ Π² Π‘++ ΠΊΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚Π°ΠΊΠΆΠ΅ собираСтся Π² *Π‘Python Extension*. Π”ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ сущСствуСт Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΡΠΎΠ±Ρ€Π°Ρ‚ΡŒ вСсь ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π² **ΠΎΠ΄ΠΈΠ½ исполняСмый Ρ„Π°ΠΉΠ»**, Ρ‚ΠΎΠ³Π΄Π° ΡƒΠΆΠ΅ сам *CPython* ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ ΠΊ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ ΠΊΠ°ΠΊ динамичСская Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° *libpython*. *Nuitka* ΠΏΠΎΠΊΠ° Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Π΅Ρ‚ Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ², поэтому Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚ΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ΄ ΠΈ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π΅ зависят ΠΎΡ‚ наличия Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΠΉ. ΠŸΠΎΠ»ΡƒΡ‡Π΅Π½Π½Π°Ρ ΠΆΠ΅ ΡΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ Π² ΠΌΠΎΠ΅ΠΌ тСстС **соотвСтствуСт Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρƒ mypy** Π½Π° Π½Π΅ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π΅. ## Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ НСдавно ΠΎΠ΄ΠΈΠ½ ΠΌΠΎΠΉ ΠΊΠΎΠ»Π»Π΅Π³Π° высказал ΠΌΠ½Π΅Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ *mypy* **сильно услоТняСт** Π΅ΠΌΡƒ Тизнь: ΠΈΠ· тСкста ошибок Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠ½ΡΡ‚ΡŒ, β€œΡ‡Π΅Π³ΠΎ ΠΎΠ½ ΠΎΡ‚ мСня хочСт”, Π° Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€ ΠΈΠ· *PyCharm* Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π»ΡƒΡ‡ΡˆΠ΅. Π’Π΅ΠΏΠ΅Ρ€ΡŒ я понимаю, Ρ‡Ρ‚ΠΎ ΠΎΠ½ Π½Π΅Π΄ΠΎΠΎΡ†Π΅Π½ΠΈΠ²Π°Π΅Ρ‚ *mypy*. Π’Π°ΠΊ ΠΊΠ°ΠΊ ΠΎΠ½ **Π½Π°ΠΌΠ½ΠΎΠ³ΠΎ большСС, Ρ‡Π΅ΠΌ просто синтаксичСский Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€**. По сути ΠΎΠ½ Ρ€Π΅Π°Π»ΠΈΠ·ΡƒΠ΅Ρ‚ подмноТСство языка, ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π» ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ³ΠΎ Π² ΠΏΠ»Π°Π½Π΅ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ сильно прСвосходит ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΉ python. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ встраниваниС *mypy* Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° β€” инвСстиция Π½Π΅ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π² поиск ошибок, Π½ΠΎ ΠΈ **Π±ΡƒΠ΄ΡƒΡ‰ΠΈΠΉ пСрфоманс** прилоТСния. МнС ΠΎΡ‡Π΅Π½ΡŒ ΠΏΠΎΠ½Ρ€Π°Π²ΠΈΠ»ΠΎΡΡŒ, Ρ‡Ρ‚ΠΎ взаимодСйствиС с *CPython* осущСствляСтся Ρ‡Π΅Ρ€Π΅Π· ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠΉ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚Π°Ρ‚ΠΎΡ€Π°, вСдь это позволяСт ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ΠΎΡ‡Π½ΡƒΡŽ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ†ΠΈΡŽ Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ Π½Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Ρ… ΠΌΠΎΠ΄ΡƒΠ»Π΅ΠΉ, оставив Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π° Π±Π΅Π· ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠΉ. Π’Π°ΠΊΠΎΠΉ ΠΏΡƒΡ‚ΡŒ прСдставляСтся ΠΌΠ½Π΅ **Π½Π°ΠΈΠ±ΠΎΠ»Π΅Π΅ бСзопасным** (учитывая, Ρ‡Ρ‚ΠΎ *mypyc* Π΄ΠΎ сих ΠΏΠΎΡ€ Π² Π°Π»ΡŒΡ„Π΅). ΠšΠΎΠ½Π΅Ρ‡Π½ΠΎ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π»ΠΈ *mypyc* Π½Π° ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅, Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π²Π°ΠΌ, Π½ΠΎ Ссли Π²Ρ‹ ΡƒΠΆΠ΅ ΡƒΠΏΠ΅Ρ€Π»ΠΈΡΡŒ Π² ΠΏΠΎΡ‚ΠΎΠ»ΠΎΠΊ ΠΏΠΎ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ ΠΈ ΠΏΠΎΠ΄ΡƒΠΌΡ‹Π²Π°Π΅Ρ‚Π΅ ΠΎ Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ ΠΊΠ°ΠΊΠΈΠ΅-Ρ‚ΠΎ части Π½Π° Π½ΠΈΠ·ΠΊΠΎΡƒΡ€ΠΎΠ²Π½Π΅Π²Ρ‹Π΅ языки, Ρ‚ΠΎ стоит ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΏΡƒΡΡ‚ΠΈΡ‚ΡŒ *mypyc*, Ρ‚Π΅ΠΌ Π±ΠΎΠ»Π΅Π΅, Ρ‡Ρ‚ΠΎ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это просто, Ссли Π²Ρ‹ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ mypy. ## P.S. НадСюсь, Π²Π°ΠΌ Π±Ρ‹Π»ΠΎ интСрСсно ΡƒΠ·Π½Π°Ρ‚ΡŒ ΠΎ Π½ΠΎΠ²ΠΎΠΌ способС ΠΏΠΎΠ²Ρ‹ΡˆΠ΅Π½ΠΈΡ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ python, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π³Π»ΡƒΠ±ΠΆΠ΅ Ρ€Π°Π·ΠΎΠ±Ρ€Π°Ρ‚ΡŒΡΡ Π² ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌΠ΅ компиляции динамичСски Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°. Если Ρ‚Π΅ΠΌΠ° окаТСтся интСрСсной, Ρ‚ΠΎ Π² ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ ΠΏΠ»Π°Π½ΠΈΡ€ΡƒΡŽ большС Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΡ€ΠΎ *mypyc*, Π΅Π³ΠΎ ограничСния ΠΈ частыС ошибки, Π° Ρ‚Π°ΠΊΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±ΠΎΠΉΡ‚ΠΈ. ## UPD Π’ коммСнтариях подсказали, ΠΎΠ± Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠΌ python компиляторС - *Cython*, оказываСтся Ρ‚Π΅ΠΏΠ΅Ρ€ΡŒ ΠΎΠ½ ΡƒΠΌΠ΅Π΅Ρ‚ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ python ΠΊΠΎΠ΄ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ (минуя Ρ€ΡƒΡ‡Π½ΡƒΡŽ Ρ„Π°Π·Ρƒ прСобразования ΠΊΠΎΠ΄Π° Π² *cython*\-ΠΊΠΎΠ΄). Будя ΠΏΠΎ Π·Π°ΠΌΠ΅Ρ€Π°ΠΌ cython ΠΏΠΎΠΊΠ° [Π½Π΅ ΡƒΡ‡ΠΈΡ‚Ρ‹Π²Π°Ρ‚](https://github.com/cython/cython/issues/2587) Π°Π½Π½ΠΎΡ‚Π°Ρ†ΠΈΡŽ Ρ‚ΠΈΠΏΠΎΠ², Π½ΠΎ врСмя выполнСния (*real 1.82*) оказалось посСрСдинС ΠΌΠ΅ΠΆΠ΄Ρƒ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ mypyc Π½Π° Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΈ Π½Π΅ Π°Π½Π½ΠΎΡ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ ΠΊΠΎΠ΄Π°. Но Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅Π΅ добавят Π² Π±ΡƒΠ΄ΡƒΡ‰Π΅ΠΌ.
Shard134 (laksa)
Root Hash14843476518697139734
Unparsed URLcom,habr!/ru/companies/exness/articles/542106/ s443