۳۰ شهریور ۱۴۰۳

Techboy

اخبار و اطلاعات روز تکنولوژی

نحوه استفاده از Rust با Python و Python با Rust

به لطف کتابخانه های هر دو زبان، می توانید راحتی پایتون را با سرعت Rust ادغام کنید. با پروژه PyO3 شروع کنید.

به لطف کتابخانه های هر دو زبان، می توانید راحتی پایتون را با سرعت Rust ادغام کنید. با پروژه PyO3 شروع کنید.

Python و Rust به ظاهر دو طرف طیف زبان را اشغال می کنند. Python که در زمان اجرا تفسیر می‌شود، یک محیط برنامه‌نویسی انعطاف‌پذیر و راحت را به توسعه‌دهندگان ارائه می‌دهد، اما به قیمت سرعت خام. Rust سرعت و تضمین ایمنی حافظه را فراهم می کند، اما مستلزم یادگیری یک الگوی جدید برای مدیریت عملیات حافظه است.

در تئوری، این زبان ها نباید رقابت کنند. آنها باید همکاری کنند. و در عمل می توانند. Rust می تواند از سهولت استفاده پایتون و پایتون از سرعت و ایمنی Rust بهره مند شود.

اگر می خواهید از Rust با پایتون یا پایتون با Rust استفاده کنید، باید حداقل با هر دو زبان آشنایی کافی داشته باشید تا بهترین نتایج را به دست آورید. همچنین باید تصمیم بگیرید که کدام یک از این دو زبان اصلی شماست، زیرا گزینه‌های هر رویکرد به طور قابل توجهی متفاوت است.

فراخوانی Rust از پایتون با PyO3

اگر پایتون زبان اصلی شماست، ادغام با Rust از نظر مفهومی مانند ادغام پایتون با C عمل می‌کند. پیاده‌سازی پیش‌فرض پایتون، که به زبان C نوشته شده است، از پسوندهایی استفاده می‌کند که به زبان C نوشته شده‌اند یا از ABI سازگار با C استفاده می‌کنند. برنامه‌های افزودنی نوشته شده در Rust که از ABI یکسانی استفاده می‌کنند نیز کار می‌کنند، اگرچه این خودکار نیست—شما باید از جعبه‌هایی استفاده کنید که برای ارائه اتصالات برای توابع Rust به Python C API طراحی شده‌اند.

Copilot Runtime: ساختن هوش مصنوعی در ویندوز

ایجاد پیوندهای Rust در پایتون

شناخته شده ترین پروژه برای ایجاد پیوندهای Rust در پایتون PyO3 است. می توان از آن برای نوشتن ماژول های پایتون در Rust یا برای جاسازی زمان اجرا پایتون در یک Rust باینری استفاده کرد.

PyO3 از پروژه دیگری استفاده می‌کند، Maturin، که ابزاری برای نوشتن جعبه‌های Rust با بسته‌بندی و اتصالات پایتون است. هنگامی که Maturin در محیط مجازی پایتون نصب می‌شود، می‌توان از خط فرمان برای مقداردهی اولیه پروژه Rust جدید با اتصالات پایتون استفاده کرد. توسعه‌دهنده از دستورالعمل‌ها در کد Rust برای نشان دادن آنچه تابع Rust برای افشای پایتون و نحوه نمایش کل پروژه Rust به پایتون به عنوان یک ماژول قابل واردات.

نگاشت انواع Rust و Python

یکی از جنبه‌های مفید PyO3 نگاشت بین انواع Rust و Python است. توابع نوشته شده در Rust می توانند انواع Python بومی یا Rust تبدیل شده از انواع Python را بپذیرند. برای مثال، یک شی bytearray یا bytes در پایتون به زیبایی به یک Vec در Rust و یک str در پایتون می تواند به صورت Rust String ارائه شود.

انواع پیچیده‌تر، مانند فرهنگ لغت پایتون یا عدد صحیحی که برای یک عدد صحیح بومی ماشین خیلی بزرگ است، تبدیل‌های Rust نیز دارند، اما برخی به اجزای اختیاری نیاز دارند. برای مثال، اگر می‌خواهید از اعداد صحیح پایتون با اندازه دلخواه استفاده کنید، باید ویژگی اختیاری num-bigint را در PyO3 نصب کنید و آن اعداد صحیح را در Rust به صورت num_bigint::BigInt< بیان کنید. /code> یا num_bigint::BigUint انواع.

تبدیل از Python به Rust هزینه ای برای هر تماس دارد، اما شما را از استفاده کامل از انواع Python در کد Rust خلاص می کند. در دنیای Cython، این شبیه به تبدیل به انواع C است: برای هر تبدیل هزینه ای وجود دارد، اما اگر هدف شما پردازش عددی به طور کامل در C باشد، سرعت بیشتری به همراه دارد.

فراخوانی پایتون از Rust 

اگر در درجه اول توسعه دهنده Rust هستید اما می خواهید از Python در داخل برنامه Rust استفاده کنید، PyO3 مکانیسم هایی برای فراخوانی پایتون از داخل کد Rust.

کد پایتون را می توان به صورت خطی در برنامه Rust تعریف کرد، در بایت کد پایتون کامپایل کرد و با استفاده از فراخوانی Rust اجرا کرد. ساختارهای Rust مانند HashMap یا BTreeMap می‌توانند برای ارسال فهرست‌های آرگومان موقعیتی یا کلیدواژه استفاده شوند. شما حتی می توانید فقط عبارات واحد را ارزیابی کنید اگر این همه چیزی است که نیاز دارید.

برنامه‌های Rust می‌توانند مفسر CPython را فراخوانی کنند و با آن کار کنند، به شما این امکان را می‌دهند که اشیاء پایتون را در Rust ایجاد و دستکاری کنید و فراخوانی‌های کتابخانه را انجام دهید. فایل‌های کد پایتون موجود را نیز می‌توان بارگیری کرد و استفاده کرد، اما این یک خطر امنیتی بالقوه است، بنابراین کدهای نامعتبر را بارگیری نکنید یا از این گزینه در شرایطی استفاده نکنید که به طور بالقوه می‌توانید این کار را انجام دهید.

اگر با Rust بیشتر از Python آشنایی دارید، بهتر است حداقل با API Python C و انواع مختلف شیء Python قبل از شیرجه زدن در داخل.

یک پروژه قبلی، جعبه cpython نیز به Python اجازه داخل یک برنامه Rust را می داد، اما دیگر به طور فعال نگهداری نمی شود و توسعه دهندگان آن استفاده از PyO3 را به جای آن توصیه می کنند.

نکات عملکرد

یک نکته مهم در مورد PyO3 این است که همیشه تعداد دفعاتی که داده ها بین دو زبان ارسال می شود به حداقل برسد. هر تماس از پایتون به Rust یا بالعکس مقداری سربار را متحمل می شود. اگر سربار بیشتر از کاری باشد که در Rust انجام می‌دهید، هیچ بهبود عملکرد قابل توجهی نخواهید دید.

به عنوان مثال، اگر در حال حلقه زدن روی یک مجموعه شی هستید، شی را به Rust ارسال کنید و حلقه را در آنجا انجام دهید. این کارآمدتر از حلقه زدن در سمت پایتون و فراخوانی کد Rust با هر بار تکرار حلقه است.

این دستورالعمل همچنین به طور کلی برای ادغام بین Python و سایر کدهایی که از Python C ABI استفاده می‌کنند، مانند ماژول‌های Cython نیز اعمال می‌شود.