Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Moscow Python Meetup №84. Иван Кривошеев (Positive Technologies, ведущий разработчик). Покрываем ржавчиной Python: способы интеграции

Moscow Python Meetup №84. Иван Кривошеев (Positive Technologies, ведущий разработчик). Покрываем ржавчиной Python: способы интеграции

В своем докладе расскажу о способах интеграции Python и Rust.

Видео: https://youtu.be/eDZHEkKZXuU

Moscow Python: http://moscowpython.ru
Курсы Learn Python: http://learn.python.ru
Moscow Python Podcast: http://podcast.python.ru
Заявки на доклады: https://bit.ly/mp-speaker

Moscow Python Meetup

October 25, 2023
Tweet

More Decks by Moscow Python Meetup

Other Decks in Programming

Transcript

  1. Иван Кривошеев О себе • Ведущий разработчик в продукте PT

    Sandbox • Пишу на Python и Rust (в проде) • 10 лет в разработке • Люблю Open Source • Вечерами пишу на Си
  2. • Почему стоит покрывать Python “ржавчиной” • Как покрывать Python

    “ржавчиной” • Поговорим про сборку пакета на Rust для Python • Проблемы при интеграции Python и Rust О чем доклад
  3. • Оптимизация узких мест в Python • Возможность параллельной обработки

    с использованием нескольких ядер • Перестать блокировать event-loop при “тяжелых” CPU задачах Задачи
  4. • Компилируется в бинарный код • Легко интегрируется с Python

    • Имеет хорошую экосистему • Помогает не “выстрелить себе в ногу” Требования
  5. Почему Rust • Есть учебник (https://doc.rust-lang.org/book/) • Прекрасная документация (https://docs.rs/)

    • Удобная система сборки проектов • Концепция владения объектами • Легкая в освоении многопоточность • Очень трудно “выстрелить себе в ногу” • Удобная интеграция с Python
  6. Как покрывать Python “ржавчиной” 1. Отдельный микросервис. Проблема - сложная

    интеграция 2. “Сишный” интерфейс на Rust. Проблема - монструозный код и много обвязки
  7. Wheel {distribution}-{version}(-{build tag})?-{python tag}-{abi tag}-{platform tag}.whl • distribution - имя

    пакета • version - версия пакета • build tag - опциональное поле с номером сборки Ссылки: • https://packaging.python.org/en/latest/specifications/platform-compatibility-tag s/#platform-compatibility-tags • https://peps.python.org/pep-0427/
  8. Python tag • py: Generic Python • cp: Cpython •

    ip: IronPython • pp: PyPy • jy: Jython
  9. ABI соглашение на бинарном уровне, после компиляции программы в бинарный

    код > ABI/API API соглашение на уровне кода, до компиляции программы в бинарный код. >
  10. ABI tag • none - не требует никакой совместимости на

    уровне ABI • cp33d - CPython 3.3 с отладочными символами • abi3
  11. Python Limited С API/Stable ABI • Python3.2 - предоставил ограниченный

    набор из Python С API и дал Гарантии • Python дает гарантии что в libpython*.so будет определённый набор “символов”, которые останутся совместимы во всех Python3.x версиях • <libname>.abi3.so Ссылка: https://docs.python.org/3/c-api/stable.html
  12. Ограничения • Может уменьшиться скорость исполнения кода • Не дает

    гарантии, что код собранный под Python младшей версии, соберется под Python более старшей версии • Python не проверяет, что <libname>.abi3.so - собрано под запускаемой версией Python • Стабильность ABI - также зависит от платформы, на которой запускается модуль
  13. manylinux • manylinux_${GLIBC_MAJOR}_${GLIBC_MINOR}_${ARCH} • manylinux1_* - алиас: manylinux_2_5 • manylinux2010_*

    - алиас: manylinux_2_12 • manylinux2014_* - алиас: manylinux_2_14 Ссылка: https://peps.python.org/pep-0600/
  14. Проблемы • Неудобная работы с памятью • Неудобная работа с

    исключениями • На больших проектах страдает время сборки • PyO3 - неконсистентное API • PyO3 - много неявного копирования и создания объектов