+38/050/370-3627
+38/093/220-0872
+38/044/257-2444
Новини

Facebook опублікував вихідні тексти Cinder, форка CPython, що використовується в Instagram

Facebook опублікував вихідний код Попелюшки, вилки CPython, який використовується в Instagram

Facebook опублікував вихідний код проекту Cinder , який розробляє гілку CPython 3.8.5, основну еталонну реалізацію мови програмування Python. Попелюшка використовується в операційній інфраструктурі Facebook для забезпечення функціонування сервісу Instagram і включає оптимізацію для підвищення продуктивності.

Код був опублікований для обговорення можливості перенесення підготовлених оптимізацій на основну команду CPython і для допомоги іншим проектам, що займаються поліпшенням продуктивності CPython. Facebook не збирається підтримувати Cinder у вигляді окремого проекту з відкритим вихідним кодом і код представлений в тому вигляді, в якому він використовується в інфраструктурі компанії, без додаткового волосся і документації. Попелюшка також не намагається просувати як альтернативу CPython - головною метою розвитку є бажання поліпшити сам CPython.

Код Попелюшки відзначається як досить надійний і перевірений в виробничих середовищах, але при виявленні проблем їх доведеться вирішувати самостійно, так як Facebook не гарантує, що буде реагувати на зовнішні повідомлення про помилки і запити на витягування. При цьому Facebook не виключає конструктивної співпраці зі спільнотою і готовий обговорювати ідеї, як зробити Попелюшку ще швидше або як прискорити перенесення підготовлених змін в основний список CPython.

Основними оптимізаціями, реалізованими в «Попелюшці», є:

  • Кешування вбудованого байт-коду ("тіньовий байт-код"). Суть методу полягає у виявленні ситуацій виконання типового коду операції, які можна оптимізувати, і динамічній заміні такого коду операції більш швидкими спеціалізованими варіантами (наприклад, заміна часто званих функцій).
  • Жадібна оцінка корутину. Для викликів функцій async, які відразу обробляються (очікування не викликає очікування і функція досягає оператору повернення раніше), результат таких функцій безпосередньо підставляється без створення підпрограми і без залучення циклу подій. У коді, використовуваному в Facebook, в якому активно використовується async/await, оптимізація призводить до прискорення близько 5%.
  • Вибіркова JIT-компіляція на рівні окремих методів і функцій (method-at-a-time). Він включається через опцію «-X jit» або змінну середовища PYTHONJIT=1 і дозволяє прискорити виконання багатьох тестів продуктивності в 1,5-4 рази. Оскільки JIT-компіляція актуальна тільки для часто виконуваних функцій, використовувати її для рідко використовуваних функцій недоцільно, накладні витрати на компіляцію яких можуть тільки уповільнити виконання програми.

    Через опцію "-X jit-list-file=/path/to/jitlist.txt" або змінну середовища "PYTHONJITLISTFILE=/path/to/jitlist.txt" можна вказати файл зі списком функцій, для яких можна використовувати JIT (формат path.to.module:funcname або path.to.module:ClassName.method_name). Список функцій, для яких потрібно включити JIT, можна визначити за результатами профілювання. Надалі очікується підтримка динамічної JIT-компіляції на основі внутрішнього аналізу частоти викликів функцій, але з урахуванням специфіки запуску процесів в Instagram JIT-компіляція на початковому етапі підійде і для Facebook.

    JIT спочатку перетворює байт-код Python в високорівневе проміжне представлення (HIR), яке знаходиться досить близько до байт-коду Python, але призначене для використання зареєстрованої віртуальної машини замість стекованої, а також використовує інформацію про тип і додаткові деталі, важливі для продуктивності (наприклад, підрахунок посилань). Потім HIR перетворюється в форму SSA (статичне одиночне призначення) і проходить етапи оптимізації, які враховують результати підрахунку посилань і дані про споживання пам'яті. В результаті генерується низькорівневе проміжне представлення (LIR), яке близьке до мови асемблера. Після чергового етапу оптимізації на основі LIR , інструкції збірки генеруються за допомогою бібліотеки asmjit .

  • Строгий режим для модулів. Функціонал включає в себе три компоненти: тип StrictModule. Статичний аналізатор, який може визначити, що виконання модуля не впливає на код за межами цього модуля. Завантажувач модулів, який визначає, що модулі були переведені в суворий режим (код вказує «імпорт __strict__»), перевіряє відсутність перекриття з іншими модулями і завантажує суворі модулі в sys.modules як об'єкт StrictModule.
  • Static Python - це експериментальний компілятор байт-кодів, який використовує анотації типів для створення специфічного для типу байт-коду, який є швидшим завдяки використанню компіляції just-in-time. У деяких тестах комбінація Static Python і JIT показує поліпшення продуктивності до 7 разів, в порівнянні з типовим CPython. У багатьох ситуаціях результати оцінюються як близькі до використання компіляторів MyPyC та Cython .

Інші новини

Найкраща ціна