, Ускоряем ваш Python при помощи Rust

Ускоряем ваш Python при помощи Rust

Максвелл Флиттон

 

Первая публикация на английском языке: Декабрь 2021

Ссылка на продукт: 1151221

Все права защищены. Никакая часть этой книги не может быть воспроизведена, сохранена в поисковой системе или передана в любой форме или любыми средствами без предварительного письменного разрешения издателя, за исключением случаев кратких цитат, встроенных в критические статьи и обзоры.

При подготовке этой книги были предприняты все усилия чтобы гарантировать точность представленной информации. Тем не менее, информация, содержащаяся в этой книге, продаётся без гарантии в явном или неявном виде. Ни авторы, ни Packt Publishing, ни их дилеры и дистрибьюторы не будут нести ответственность за любые убытки, вызванные или предположительно вызванные прямо или косвенно этой книгой.

Packt Publishing пыталась предоставить информацию о товарных знаках обо всех компаниях и продуктов, упомянутых в данной книге для надлежащего использования капиталов. Тем не менее, Packt Publishing не может гарантировать точность этой информации.

Опубликовано Packt Publishing Ltd.

Livery Place

35 Livery Street

Birmingham B3 2PB, UK

ISBN 978-1-80181-144-6

www.packtpub.com

2022-01-25

 Состав исполнителей

Автор
Максвелл Флиттон
Управляющий группой продуктов
Рича Трайпати
Управляющий изания продукта
Рича Трайпати
Главный редактор
Ниша Клитас
Редактор разработки содержимого
Вайшайли Рамкумар
Технический редактор
Прейдип Сейху
Литературный редактор
Safis Editing
Координатор проекта
Дикша Тхаккар
Корректор
Safis Editing
Составитель указателя
Манжу Эйрейсан
Технолог
Шанкар Калбхор

Моей жене, Мелани Чжан, которая была со мной и поддерживала меня в напряжённом рабочем графике со сжатыми сроками. Ты не только умна и заботлива, но и впечатляющий игрок команды.

 Об авторе

Максвелл Флиттон является инженером- программистом, который работает в фонде моделирования финансовых потерь с открытым исходным кодом OasisLMF. В 011 году Максвелл получил степень бакалавра наук в области сестринского дела в Университете Линкольна, Великобритания. Работая по 12 часов в отделениях экстренной и неотложной медицинской помощи в больницах, Максвелл получил ещё одну степень по физике в Открытом Университете в Великобритании, а затем перешёл к другому важному этапу, получив диплом аспиранта по физике и технике в области медицины в UCL в Лондоне. Он работал над многочисленными проектами, например, над программным обеспечением медицинского моделирования для правительства Германии и курировал студентов вычислительной медицины в Имперском колледже Лондона. У него также имеется опыт работы в области финансовых технологий и искусственного интеллекта Monolith.

Премного благодарен содружеству Rust за раработку удивительного языка программирования с дружественным сообществом, которое готово раздвигать границы. Я также благодарен команде Monolith AI, где Сараванан Сатьянанда и Ричард Альфельд помогли мне вырасти как инженеру. Это было продолжено командой OasisLMF, где Бен Хейс, Стефан Струзик, Сэм Гэмбл и Хасан Чагани поддержали меня и помогли мне расти.

 Рецензенты

Марио Айдайвал - бразилец и любитель направленных на разработку программного обеспечения технологий, в основном, ориентированных на языки программирования. В свободное время он работает техническим менеджером и инженером- программистом. Он начал свой путь в качестве разработчика программного обеспечения в 2011 году, изучая лишь учебные материалы из Интернета, начав с изучения C и вскоре после этого перешёл на Python, что позволило ему получить свою первую работу после 6 месяцев обучения.

Сегодня, обладая 10- летним опытом работы, он доставлял программное обеспечение в различные области, включая кредитование, туризм и путешествия, искусственный интеллект, электронный обмен данными, автоматизацию процессов и криптовалюту. В настоящее время он сосредоточен на изучении и распространении языка Rust. Он также поддерживает и само сообщество Rust в проекте Rust By Example.

Бойд Джонсон работал в отрасли программного обеспечения начиная с 2015 года. В составе команды Bitwise IO совместно с партнёрами из Intel он работал над разработкой Hyperledger Sawtooth, блокчейна с открытым исходным кодом, на Python и Rust. Бойд работал, в частности, над слоем FFI между Python и Rust, а также над компонентами обработки транзакций. Вы можете прочитать больше о том, что написал Бойд, на сайте boydjohnson.dev.

 www.PacktPub.com

 Предисловие

Язык программирования Rust это захватывающий воображение новый язык программирования. он даёт нам безопасность памяти без процедуры сборки мусора, что имеет результатом быстрое время работы и низкое потребление памяти. Тем не менее, переписывать всё на Rust может быть дорого и рискованно, поскольку в Rust может отсутствовать поддержка пакетов для подлежащей решению задачи. Вот тут- то и приходят на помощь привязки и pip Python. Эта книга позволит вам писать модули Rust, которые могут устанавливаться при помощи pip. В результате вы сможете внедрять Rust по мере необходимости, не беря на себя весь риск и всю работу по переписыванию вашей системы полностью. Это делает для вас, как для разработчика, экспериментировать с Rust в ваших проектах Python и применять его.

 Для кого эта книга

Выгоду от этой книги получат разработчики Python, которые хотят ускорять свой код при помощи Rust или поэкспериментировать с Rust без получения большого риска или больших трудозатрат. Не требуется никаких базовых знаний по Rust. Эта книга обладает неким введением в Rust для разработчиков Python и пользуется примерами на Python для быстрого ускорения вами при помощи Rust.

 Что охватывает эта книга

Глава 1. Введение в Rust с точки зрения Python покрывает основы Rust чтобы сделать возможной разработку на Rust. Чтобы помочь вам уловить рассматриваемые понятия Rust, приводятся соответствующие примеры на Python.

Глава 2. Структурирование кода в Rust поясняет как выстраивать структуру программ Rust на множестве страниц и применять инструменты управления пакетами для организации и установки зависимостей.

Глава 3. Основы одновременности рассказывает как организовать в Rust многопоточность и множество процессов, поскольку Rust обладает "неустрашимым одновременным исполнением". Мы также рассмотрим одновременность в Python, чтобы увидеть имеющиеся отличия.

Глава 4. Сборка модулей pip в Python собирая пакеты Python, мы создаём пакеты, которые можно установить при помощи pip. Здесь также рассказывается как можно размещать в GitHub пакеты частным образом.

Глава 5. Создание интерфейса Rust для нашего модуля pip заставляет нас внедрить Rust в наш модуль pip и применять инструменты установки Rust для компиляции и применения кода Rust в нашем коде Python.

Глава 6. Работа с объектами Python в Rust рассматривает как совместимость не следует только в одном направлении. В этой главе мы получаем объекты Python и взаимодействуем с ними. Также мы создаём объекты в Rust.

Глава 7. Применение модулей Python при помощи Rust основывается на предыдущей главе и показывает нам как применять такие модули Python как NumPy в нашем коде Rust.

Глава 8. Комплексное структурирование Python в Rust показывает нам обёртывание всего рассмотренного нами в полностью функциональный пакет Python, написанный на Rust. Такой пакет обладает интерфейсами Python и функциональностью командной строки, которая получает файлов YAML для настроек.

Глава 9. Структурирование прикладного приложения Flask Python для Rust строит нам прикладное приложение Flask Python с базой данных PostgreSQL, балансировщиком нагрузки NGINX и рабочим процессом Celery для получения больших практических навыков работы с Rust. Все это упаковано в Docker, чтобы подготовить нас к внедрению Rust во все такие аспекты веб-приложения.

Глава 10. Внедрение Rust в прикладное приложение Flask Python описывает как взять построенное нами в предыдущей главе веб приложение и внедрить наш модуль Rust в надлежащий контейнер Docker для исполнителя Celery и приложения Flask. Мы также распечатываем те миграции, которые уже были применены для автоматической выработки схемы нашей базы данных с тем, чтобы наш код Rust был способен напрямую взаимодействовать с необходимой базой данных.

Глава 11. Рекомендации для интеграции Rust завершает эту книгу некими уловками относительно того как избегать распространённых ошибок, продолжая писать код Rust для Python.

 Как получить максимальную выгоду от этой книги

Желательно чтобы вы разбирались в Python и были лишены апряжённости в отношении объектно- ориентированного программирования. Будут затрагиваться некоторые современные темы, такие как метаклассы, но они не являются существенными. В этой книге описаны программирование Rust, прикладные приложения Python и модули Python, устанавливаемые при помощи pip.

Таблица 0-1. Требования книги
Рассмариваемое в этой книге программное/аппаратное обеспечение Требования к операционной системе

Python 3

Windows, macOS или Linux

Rust

Windows, macOS или Linux

Docker

Windows, macOS или Linux

Py03

Windows, macOS или Linux

Redis

Windows, macOS или Linux

PostgreSQL

Windows, macOS или Linux

Если вы применяете цифровую версию данной книги, мы предлагаем вам набирать любой код этой книги или параметры настройки самостоятельно или получать доступ к такому коду через репозиторий GitHub (ссылка на него доступна в нашем следующем разделе). Следование этому поможет вам избежать любых потенциальных ошибок, связанных с копированием и вставкой для читающих PDF или электронную книгу {Прим. пер.: в своём переводе мы постарались проверять и это.}

 Выгрузка примеров кода

Весь пакет кода для данной книге располагается в GitHub. У нас также имеются и прочие пакеты кодов из нашего богатого каталога книг и видео доступных по этому адресу. Проверьте и его!

 Выгрузка цветных изображений

Помимо всего прочего мы также предоставляем некий файл PDF, который содержит цветные изображения снимков экранов/ схем, применяющихся в данной книге. Вы можете получить их здесь.

 Соглашения

На протяжении этой книги имеется ряд соглашений о применении текста в книге.

CodeInText: указывают на кодовые слова в тексте, имена таблиц базы данных, имена папок, имена файлов, модели URL-адресов, ввод пользователя, и обработчики Twitter. Вот некий образец: "Смонтируйте выгруженный файл образа диска WebStorm-10*.dmg в качестве другого диска в вашей системе".

Блок кода установлен так:


use std::error::Error;
use std::fs::File;
use csv;

use super::structs::FootPrint;
 	   

Когда мы желаем привлечь ваше внимание к определённой части блока кода, соответствующие строки устанавливаются жирным шрифтом:


let code = "5 + 6";
let result = py.eval(code, None, Some(&locals)).unwrap();
let number = result.extract::<i32>().unwrap();
 	   

Весь ввод или вывод командной строки записывается следующим образом:


pip install git+https://github.com/maxwellflitton/flitton-fib-rs@main
 	   

Жирно: выделяются новые термины и важные слова или слова, которые вы видите на экране. Например, слова в меню или блоках диалогов появляются в тексте Жирно. Вот некий образец: "Это может быть выполнено посредством клика по закладке Settings и далее по закладке Secrets в боковой вставке слева, как вы можете наблюдать здесь".

[Замечание]Замечание

Предостережения или важные замечания появляются в блоках подобных этому.

[Совет]Совет

Советы и ловкие приёмы возникают таким образом.

 Обратная связь с читателями

Обращения наших читателей всегда приветствуются. Дайте нам знать что вы думаете об этой книге - что вам нравится или не нравится. Обратная связь с читателями важна нам, так как помогает нам разрабатывать издания, от которых вы на самом деле получите максимальную пользу.

Для отправки обычного отклика просто пошлите электронное письмо на адрес feedback@packtpub.com с упоминанием заголовка книги в теме вашего сообщения.

Если у вас существует тема, в которой у вас имеется опыт и вы заинтересованы либо в написании, либо во вкладе в книгу, обратитесь к руководству по адресу www.packtpub.com/authors.

 Поддержка пользователей

Теперь, когда вы являетесь гордым владельцем книги Packt, у нас есть целый ряд моментов для помощи вам в получении максимальной выгоды от вашей покупки.

 Опечатки

Хотя мы и предприняли все меры чтобы обеспечить точность нашего содержимого, ошибки всё- таки возможны. Если вы обнаружили ошибку в нашей книге - возможно, ошибку в тексте или в коде - мы будем признательны если вы сообщите об этом нам. Сделав это, вы можете предостеречь остальных читателей от разочарования и помочь нам улучшить последующие версии данной книги. Если вы обнаружили ошибку, пожалуйста, сообщите о ней посетив www.packtpub.com/submit-errata, выбрав вашу книгу, кликнув на ссылку Errata Submission Form, и заполнив подробности найденной вами ошибки. Когда ваша ошибка будет проверена, вы получите уведомление и ошибка будет выложена на наш веб- сайт или добавлена в какой- нибудь перечень существующих ошибок с заголовком раздела Errata.

Для просмотра ранее выявленных ошибок посетите www.packtpub.com/books/content/support и введите название нужной книги в поле поиска. Необходимая информация появится в разделе Errata.

 Незаконное тиражирование

Пиратство, защищённых авторским правом материалов в Интернете является постоянной проблемой во всех средствах массовой информации. В Packt мы подходим к защите наших авторских прав и лицензий очень серьёзно. Если вы столкнётесь с какой-либо незаконной копией наших работ в любой форме в Интернете, пожалуйста, предоставьте нам сразу адрес местонахождения или имя веб-сайта, чтобы мы могли принять меры. {Прим. пер.: Согласно закону об авторском праве РФ, авторские права на перевод принадлежат авторам этого перевода. Данным переводом, по нашему мнению, мы служим популяризации основных стратегических направлений развития тем Packt. В случае наличия конструктивных предложений, готовы к тесному сотрудничеству.}

Пожалуйста, обратитесь по адресу copyright@packtpub.com со ссылкой на материалы содержащие признаки нарушения авторских прав.

Мы выражаем вам признательность в защите наших авторов и нашей возможности доносить до вас имеющего ценность содержимого.

 Вопросы

Если у вас есть проблемы по любым сторонам данной книги, вы можете контактировать с нами по адресу questions@packtpub.com и мы предпримем все меры в отношении ваших проблем.

 Содержание

Предисловие
Что охватывает эта книга
Как получить максимальную выгоду от этой книги
Для кого эта книга
Соглашения
Обратная связь с читателями
Поддержка пользователей
Опечатки
Незаконное тиражирование
Вопросы
Раздел 1. Знакомство с Rust
Глава 1. Введение в Rust с точки зрения Python
Технические требования
Разбираемся с имеющимися различиями между Python и Rust
Зачем сплавлять Python с Rust?
Передача строк в Rust
Установление размеров плавающих и целых чисел в Rust
Управление данными в векторах и массивах Rust
Замена словарей хэш-картами
Обработка ошибок в Rust
Основы владения переменной
Копирование
Перемещение
Заимствование без изменения
Изменяемое заимствование
Отслеживание областей действия и времени жизни
Сборка структур вместо объектов
Метапрограммирование при помощи макросов вместо декораторов
Выводы
Вопросы
Ответы
Дальнейшее чтение
Глава 2. Структурирование кода в Rust
Технические требования
Управление нашим кодом при помощи шасси и Cargo вместо pip
Структурирование кода по множеству файлов и модулей
Сборка интерфейсов модуля
Преимущество документирования при кодировании
Взаимодействие со средой
Выводы
Вопросы
Ответы
Дальнейшее чтение
Глава 3. Основы одновременности
Технические требования
Представляем одновременность
Потоки
Процессы
Основы программирования одновременности при помощи потоков
Исполнение множества процессов
Безопасная персонализация потоков и процессов
Закон Амдала
Взаимные блокировки
Состязательность
Выводы
Вопросы
Ответы
Дальнейшее чтение
Раздел 2. Сплавляем Rust с Python
Глава 4. Сборка модулей pip в Python
Технические требования
Настройка установки инструментов для модуля pip Python
Создание репозитория GitHub
Определение базовых параметров
Определение файла README
Определение базового модуля
Упаковка кода Python в модуль pip
Построение кода вычисления Фибоначчи
Создание интерфейса командной строки
Сборка тестовых элементов
Настройка непрерывной интеграции
Развёртывание вручную в PyPI
Управление зависимостями
Настройка проверок типа для Python
Настройка и выполнение тестов и проверок типа при помощи GitHub Actions
Создание автоматического ведения версий для нашего пакета pip
Развёртывание в PyPI с применением GitHub Actions
Выводы
Вопросы
Ответы
Дальнейшее чтение
Глава 5. Создание интерфейса Rust для нашего модуля pip
Технические требования
Упаковка Rust при помощи pip
Определение gitignore и Cargo для нашего пакета
Настройка процесса установки Python для нашего пакета
Установка библиотеки Rust для нашего пакета
Сборка интерфейса Rust при помощи шасси pyO3
Сборка нашего кода Фибоначчи
Создание инструментов командной строки для нашего пакета
Создание адаптеров для нашего пакета
Сборка тестов для нашего пакета Rust
Сопоставление скоростей в Python, Rust и Numba
Выводы
Вопросы
Ответы
Дальнейшее чтение
Глава 6. Работа с объектами Python в Rust
Технические требования
Передача сложных объектов Python в Rust
Обновление нашего файла setup.py для поддержки загрузки .yml
Определение нашей команды загрузки .yml
Обработка данных из нашего словаря Python
Выделение данных из нашего файла настроек
Возвращение нашего словаря Rust в нашу систему Python
Инспекция индивидуальных объектов Python и работа с ними
Создание объекта для нашего интерфейса Rust
Приобретение Python GIL в Rust
Добавление данных в нашу вновь созданную структуру PyDict
Настройка атрибутов для нашего индивидуального объекта
Конструирование наших собственных индивидуальных объектов Python в Rust
Определение класса Python с помощью необходимых атрибутов
Определение методов статического класса для обработки ввода чисел
Определение конструктора класса
Обёртывание и тестирование нашего модуля
Выводы
Вопросы
Ответы
Дальнейшее чтение
Глава 7. Применение модулей Python при помощи Rust
Технические требования
Исследование NumPy
Добавление векторов в NumPy
Добавление векторов в чистом Python
Добавление векторов с применением NumPy в Rust
Построение модели в NumPy
Определение нашей модели
Сборка объекта Python, который исполняет нашу модель
Применение NumPy и прочих модулей Python в Rust
Повторное создание нашей модели NumPy в Rust
Сборка функций get_weight_matrix и inverse_weight_matrix
Сборка функций get_parameters, get_times и get_input_vector
Сборка функций calculate_parameters и calculate_times
Добавление функций вычисления в имеющиеся привязки Python и добавление зависимости NumPy в наш файл setup.py
Сборка нашего интерфейса Python
Выводы
Вопросы
Ответы
Дальнейшее чтение
Глава 8. Комплексное структурирование Python в Rust
Технические требования
Разбираем проблему моделирования катастроф для своего пакета
Строим комплексное решение в виде пакета
Построение процесса слияния отпечатков
Потсроение процесса слияния имеющейся уязвимости
Сборка интерфейса Python в Rust
Сборка нашего интерфейса в Python
Сборка инструкций установки пакета
Применение и тестирование нашего пакета
Сборка модели конструкции Python при помощи pandas
Построение функции генерации случаного идентификатора события
Измерение времён наших реализаций Python и Rust при помощи последовательностей с различными размерами данных
Выводы
Вопросы
Ответы
Дальнейшее чтение
Раздел 3. Внедряем Rust в веб- приложение
Глава 9. Структурирование прикладного приложения Flask Python для Rust
Технические требования
Сборка базового приложения Flask
Построение точки входа для нашего приложения
Построение нашего модуля вычисления числа Фибоначчи
Сборка образа Docker для нашего приложения
Сборка службы NGINX
Подключение и исполнение нашей службы NGINX
Определение нашего уровня доступа к данным
Определение базы данных PostgreSQL в docker-compose
Сборка конфигурации загружаемой системы
Сборка нашего уровня доступа
Настройка системы миграции базы данных приложения
Построение моделей базы данных
Применение имеющегося уровня доступа к базе данных для представления вычисления fib
Сборка шины сообщений
Построение брокера Celery для Flask
Сборка задачи вычисления Фибоначчи для Celery
Обновление нашего представления вычисления
Обновление нашей службы Celery в Docker
Выводы
Вопросы
Ответы
Дальнейшее чтение
Глава 10. Внедрение Rust в прикладное приложение Flask Python
Технические требования
Вплавляем Rust во Flask и Celery
Определяем наши зависимости в пакете вычисления числа Фибоначчи Rust
Сборка нашей модели вычислений посредством Rust
Создание представления вычисления при помощи Rust
Вставка Rust в нашу задачу Celery
Развёртывание Flask и Celery при помощи Rust
Развёртывание через частный репозиторий GitHub
Сборка сценария Bash, который выполняет оркестровку всего процесса
Перенастройка очередного пакета Fib Rust в нашем DockerFile
Вплавляем Rust в доступ к данным
Настраиваем пакет клонирования нашей базы данных
Настраиваем свою среду diesel
Автоматически вырабатываем и настраиваем свои модели и схемы базы данных
Определяем в Rust свои подключения к базе данных
Создаём функцию Rust, которая получает все имеющиеся записи Фибоначчи и возвращает их
Каждую ночь развёртываем Rust во Flask
Выводы
Вопросы
Ответы
Дальнейшее чтение
Глава 11. Рекомендации для интеграции Rust
Технические требования
Сохранение простоты реализации Rust за счёт передачи данных в Rust и обратно
Построение сценария Python, который формулирует значения чисел для вычислений
Построение файла Rust, который принимает на входе числа, вычисляет числа Фибоначчи и возвращает вычисленные числа
Построение другого сценария Python, который получает вычисленные числа и выводит их на печать
Придание интерфейсу естественности при помощи объектов
Определение особенностей
Определение поведения структуры при помощи особенностей
Передача особенностей через функции
Исполнение наших особенностей в файле main
Сохранение простоты параллелизма данных при помощи Rayon
Дальнейшее чтение
Дополнение A. Управление памятью и безопасность (Полное руководство Rust, 2е изд)
Программы и память
Как программы используют память?
Управление памятью и его виды
Подходы к выделению памяти
Стек
Куча
Ловушки управления памятью
Безопасность памяти
Триединство безопасности памяти
Владение
Вкратце об областях действия
Семантики перемещения и копирования
Дублирование типов через признаки
Копирование
Клонирование
Владение в действии
Заимствование
Правила заимствования
Заимствование в действии
Типы методов на основании заимствования
Времена жизни
Параметры времени жизни
Элизия времени жизни и правила
Время жизни в определяемых пользователем типах
Время жизни в блоках impl
Множественность времени жизни
Подтипы времени жизни
Определение границ времени жизни в общих типах
Типы указателей в Rust
Ссылки - безопасные указатели
Сырые указатели
Умные указатели
Drop
Deref и DerefMut
Типы умных указателей
Box<T>
Умные указатели со счётчиком ссылок
Rc<T>
Внутренняя изменчивость
Cell<T>
RefCell<T>
Применение внутренней изменчивости
Выводы
Указатель