Некоторые биты
Привязки Python от/к C и C ++, вероятно, являются одной из самых горячей темы для промежуточного/продвинутого инженера Python, пытаясь получить некоторую обработку на профилирование и оптимизацию, а также внутренние возможности виртуальной машины Python. Эти системы низкоуровневой системы, вероятно, являются ребятами, чтобы идти к пониманию стека Python и более широкого С-семейство языка .
Последнее самое известное дополнение к этой семье, вероятно, Rust, Mozilla, поддерживаемый язык, который обеспечивает стабильный API с 2015 года : вокруг его принятия много энтузиазма, и в этой статье я пробую эксперимент, который может предложить одному причинами; Помимо многих других преимуществ, о которых вы уже можете прочитать в Многие другие статьи вокруг Отказ Основные причины, по которым я нахожу мотивацию для изучения ржавчины:
- Это Multi-Paradigm по дизайну :
(C-подобные конструкции, но и функциональные инструменты рядом с статическими наборами и более) наиболее популярными языками вокруг, предназначены для одной парадигмы в качестве ссылки и пытались справиться, добавив поддержку других парадигм через дополнения к соответствующим стандартным библиотекам. Это, к сожалению, в конечном итоге вступает в смеси, который делает много инженеров неудовлетворенным; Результаты конструкции одной парадигмы обычно являются ограничениями в возможностях экспрессии.
- Разработано с учетом пользовательский опыт Для всего рабочего процесса/жизненного цикла:
(от установки к выпуску, через тестирование, документация, пакеты управления) большинство языков выросли в своих основных возможностях, прежде чем достичь критической массы, чтобы оправдать разработку инструментов автоматизации/производительности; Это реализовано в пробелы, конфликты и различия в качестве ценных различий между инструментами, используемыми на разных этапах развивающегося опыта.
- Это обеспечивает лучший уровень интеграции с WebAssembly (WASM) На данный момент и, возможно, в перспективе:
Webassembly достиг стабильного интерфейса, и теперь он является стандартом; Это будет платформа в верхней части которой будет построен веб-программное обеспечение. RUST обеспечивает простым доступом к Wasm, так же просто, как мы собираемся показать в этом эксперименте.
Давайте посмотрим, насколько просто начать проект, создать функцию в Rust, компилируйте библиотеку в Webassembly и, наконец, вызовите эту функцию из Python (YEA! Нет работы над C-привязками со всеми ловушками безопасности памяти и компиляции! Python позвонит родным модулям WASM).
Простым, что имеет значение
Вы можете попробовать этот эксперимент, установив:
- Рустина : Менеджер цепи на инструментах для навигации по многообразию экосистемы ржавчины
- груз : Менеджер пакета
- Rustc : компилятор, работающий вместе с остальной частью стабильной инструментальной инструментарии для вашей машины.
рустик Установите все это для вас!
Давайте начнем:
.1. Добавьте Wasm Tool-цепочку:
rustup target add wasm32-unknown-unknown
.2. Создайте новый каталог проекта и изменить:
cargo new medium-xp && cd medium-xp
.3. Создать lib.rs
Файл в SRC
каталог. Вся код идет SRC
, lib.rs
где ржавчина держит код корневого библиотека.
.4. Cargo.toml
Ваш файл конфигурации пакета, добавьте этот раздел на Cargo.toml
файл:
[lib] crate-type = ["cdylib"]
Это необходимо определить проект как динамическую библиотеку
.5. main.rs
Это ваш модуль входа, мы не собираемся использовать его на этот раз, так как мы создаем библиотеку, а не двоичную. В lib.rs
Добавьте этот код для нашей функции:
#[no_mangle] pub extern fn simple_add(a: i32, b: i32) -> i32 { a + b}
.6. Составьте библиотеку для WASM:
cargo build --release --target wasm32-unknown-unknown
Теперь вы найдете свою библиотеку в Цель/WASM32-Unknown-Unknown/Release
составлен как модуль WASM!
.7. На стороне Python:
- Установить Васмер Расширение для Python (проверено на Python 3.6):
python3.6 -m pip install wasmer
- Создать
Run-wasm-from-python.py
Файл с этим скриптом:
from wasmer import Instance path = '' with open(path, 'rb') as bytecode: wasm_bytes = bytecode.read() instance = Instance(wasm_bytes) result = instance.exports.simple_add(12, 12) print('Modules exported from Rust: ') print(instance.exports) # this will print function's name print('call simple_add(12, 12): ') print(result) # 24
- Запустите этот скрипт с:
Python3.6 Run-wasm-from-Python.py.
Если вы сделали все правильно …
Modules exported from Rust: ["simple_add"] call simple_add(12, 12): 24
Это демонстрирует, как это технически возможно сделать Python Inter работает с составленной ржавчиной, используя WASM Отказ Это невероятно просто благодаря мощной конструкции ржавчины и невероятной работы, выполненной на каждом этапе цепочки для инструментов. Как вы могли видеть, все плавно бежит с высоким уровнем повышения производительности. Я оставляю вам соображения о преимуществах и недостатках пытаться оптимизировать тяжелые нагрузки вычислений с ржавчиной, сохраняя динамический подход Python на более высоком уровне. Это было возможно только недавно, так как все интерфейсы и включенные инструменты стабилизировались благодаря большой работе, выполненной разработчиками с открытым исходным кодом по всему миру.
использованная литература
- Полный репозиторий на Github
- Определенно проверь Это reddit.
- Вашмер здесь
В той же серии
- Новый эпизод —> Некоторые примеры – 1
- Новый эпизод —> Флэк-эксперимент
Оригинал: “https://dev.to/tuned/rust-scales-python-basic-experiment-49h0”