Випуск Pyston 2, реалізація мови Python з JIT-компілятором

Випуск Pyston 2, реалізація мови Python з JIT-компілятором
3 хв. читання
29 жовтня 2020

Вийшла нова версія проєкту Pyston 2. Pyston це реалізація мови Python з використанням напрацювання проєкту LLVM. Реалізація примітна застосуванням сучасних технологій JIT-компіляції та націлена на досягнення високої продуктивності, близькою до продуктивності традиційних системних мов, таких як C ++.

Код минулих випусків Pyston поширювався під ліцензією Apache, але код Pyston 2 поки недоступний, а опубліковані лише готові збірки для Ubuntu 18.04 і 20.04 (для завантаження доступний архів з кодом, але в ньому лише заглушка з інформацією, що проєкт поки є закритим). Публікація коду входить в плани розробників, але це буде зроблено після завершення формування бізнес-моделі нової компанії, яка вирішила продовжити розробку Pyston без фінансової підтримки Dropbox.

На відміну від минулих випусків версія Pyston 2 позначена як стабільна, а не тестова. Проведена велика робота по оптимізації продуктивності. Pyston 2 тепер швидше штатного Python 3.8 приблизно на 20% при проходженні тестового набору python-macrobenchmarks. Найпомітніший виграш в продуктивності відзначається для навантажень, властивих web-застосункам. В окремих тестах, таких як chaos.py і nbody.py, Pyston 2 випереджає Python 3.8 у два рази. Ціною використання JIT є незначне збільшення споживання пам'яті.

З точки зору сумісності зі штатним Python, проєкт Pyston підноситься як найбільш сумісна з CPython альтернативна реалізація, оскільки Pyston є відгалуженням від основної кодової бази CPython. У Pyston підтримуються всі можливості CPython, в тому числі C API для розробки розширень мовою Сі.

Спочатку Pyston розвивався компанією Dropbox, яка у 2017 році прийняла рішення припинити розробку своїми силами. На початку 2020 року основні розробники Pyston заснували свою компанію, повністю переосмислили проєкт і стали займатися Pyston повний робочий день.

  CPython 3.8.5 Pyston 2.0 PyPy 7.3.2
flaskblogging mean latency 5.1ms 4.1ms 2.5ms
flaskblogging p99 latency 6.3ms 5.2ms 5.8ms
flaskblogging memory usage 47MB 54MB 228MB
djangocms warmup time n / a n / a 105s
djangocms mean latency 14.1ms 11.8ms 15.9ms
djangocms p99 latency 15.0ms 12.8ms 179ms
djangocms memory usage 84MB 91MB 279MB
pylint performance 1x 1.16x 0.50x
mypy performance 1x 1.07x unsupported
pytorch performance 1x 1.00x unsupported
pypy benchmark suite 1x 1.36x 2.48x

Технічні подробиці про начинку Pyston 2 поки не наводяться, згадано тільки використання DynASM JIT, inline-кешування і загальних оптимізацій CPython. Минула версія Pyston використовувала JIT на основі трансляції окремих методів (method-at-a-time), близький до JIT сучасних JavaScript-рушіїв. У JIT код на мові Python розбирався і транслювався в проміжне представлення LLVM (IR, Intermediate Representation). Далі IR-представлення проходило обробку в оптимізаторі LLVM і передавалося для виконання в JIT-рушій LLVM, який перетворював IR-представлення в машинний код.

Для отримання інформації про типи змінних для програм динамічною мовою Python застосовувалася техніка імовірнісного передбачення типів об'єктів з наступним уточненням правильності вибору типу в процесі виконання. Таким чином Pyston постійно варіював виконання між двома гілками - швидкою, коли дані про передбачені типи підтверджуються, і повільною, яка виконується в разі неузгодженості даних про тип змінних. Робота могла здійснюватися в багатопотоковому режимі, допускає паралельне виконання декількох ниток коду на мові Python і позбавлення від глобального блокування інтерпретатора (GIL, global interpreter lock).

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація