Вийшла нова версія проєкту 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).
Ще немає коментарів