Рубрики
Без рубрики

Расширение питона с ржавкой

Введение: Python – отличный язык программирования, но иногда это может быть немного SL … Tagged с производительностью, Python3, Rust, Python.

Вступление:

Python – отличный язык программирования, но иногда он может быть немного медленным, когда дело доходит до выполнения определенных задач. Вот почему разработчики были Здание C/C ++ расширения и интегрировать их с Python, чтобы ускорить производительность. Тем не менее, написание этих расширений немного сложно, потому что эти языки низкого уровня не являются типовыми, поэтому не гарантирует определенное поведение. Это имеет тенденцию вводить ошибки в отношении управления памятью. Руста обеспечивает безопасность памяти и, следовательно, может легко предотвратить такие ошибки.

Сценарий медленного питона:

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

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

Итак, давайте попробуем решить вышеуказанную проблему в Python и посмотрим, сможем ли мы улучшить производительность, расширив ее через Rust.

Реализации Python:

Метод I: Наивный Добавление

Это самый очевидный подход. Используя оператор Concatenate (+=) для добавления каждого сегмента к строке.

Метод II: Создайте список строк, а затем присоединяйтесь к ним

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

Метод III: Список понимания

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

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

Вот результат вышеуказанных тестов. Снизить значение, лучше подход.

Просто посмотрев на Среднее В столбце можно легко оправдать, что подход к пониманию списка, безусловно, является победителем трех подходов.

Реализации ржавчины:

После того, как попробовал базовую реализацию вышеупомянутой проблемы в ржавчине и сделав несколько грубого сравнительного анализа, используя груз-пластин Результат определенно выглядел многообещающе. Следовательно, я решил перенести реализацию Rust в качестве общей библиотеки, используя Rust-Cpython Проект и позвоните в программу Python.

Чтобы достичь этого, я создал ржавчину со следующим SRC/Lib.RS.

Создание вышеупомянутого ящика создало. Dylib файл, который должен быть переименован .так .

Затем мы пробежали тот же эталон, в том числе Rust One.

На этот раз результат более интересный.

Расширение ржавчины определенно победитель. По мере того, как вы увеличиваете количество итераций, еще больше, результат еще более многообещающий.

Например. Для следующих результатов приведены эталонные результаты

Код:

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

Вывод:

Я очень новичок в ржавчине, но эти результаты определенно вдохновляют меня учиться ржавчине больше. Если вы знаете лучшую реализацию вышеупомянутой проблемы в Rust, дайте мне знать.

Pyo3 начал вилку Rust-Cpython Но определенно имеет гораздо более активное развитие и, следовательно, в моем списке экспериментов.

Распределение вашего модуля Python потребует, чтобы расширение Rust было составлено в целевой системе из -за изменения архитектуры. Milksnake это расширение Python-Setuptools Это позволяет вам раздавать динамические связанные библиотеки на колесах Python наиболее портативным способом.

Оригинал: “https://dev.to/p_chhetri/extending-python-with-rust-4pna”